目錄
- 1.前言
- 2. 題目描述
- 3. 題目分析
- 3.1 不帶哨兵位
- 3.2 帶哨兵位
- 4. 附代碼
- 4.1 不帶哨兵位
- 4.2 帶哨兵位
1.前言
這里開始介紹從網上一些刷題網站上的題目,在這里做一些分享,和學習記錄。
先來介紹一些力扣的OJ題目。
這里的OJ就是我們不需要寫主函數,力扣會提供一個接口,在力扣中會調用我們所寫的代碼和它后臺的匹配,從而判斷我們寫的代碼正確性。
在力扣的題目中一般會給一些示例,就像這樣:
當我們寫完代碼時可以點擊運行,這時下面會出現一些測試用例,就像下面這樣:
但是并不是給了運行成功就一定能成功,必須點擊上面的提交,通過了才是真正的正確,就像下面這樣:
2. 題目描述
3. 題目分析
這里題目明確指出需要返回的是新的鏈表,所以要返回一個新鏈表的頭節點。
當我們沒有任何思路時,可以先看看它給的示例,先進行一下分析。
要找到不是val值的節點,那么首先肯定要先遍歷原來的鏈表,把不是的插入到新的鏈表中。
那首先就得先定義一個新的鏈表的頭指針struct ListNode* newhead=NULL;
為了方便實現插入,使用尾插,再定義一個新鏈表的尾指針方便插入struct ListNode* tail=NULL;
接下來就需要原鏈表中找出不是val值的節點,然后尾插就行。
怎么找出不是val值的節點?
為了不使原鏈表中的頭節點丟失,用定義一個cur指針代替,struct ListNode* cur=head;
。
用一個while
循環,當cur為空時就結束,也就是cur已經把原鏈表遍歷完了。
這里需要先考慮一下如果原鏈表為空,那就直接返回NULL就行。
在循環中怎么寫找到val的代碼?
那就先讓cur往后走,當走到cur->val=val
結束,所以這里插入的條件就是if(cur->val!=val)
,然后開始實現尾插。
3.1 不帶哨兵位
這里還需要先判斷一下新的鏈表是不是為空,如果為空,那就直接將cur=newhead
,并且更新一下tail=cur;
如果不為空,那就直接實現尾插。
if(cur->val!=val){if(newhead==NULL){newhead=cur;tail=cur;}else{tail->next=cur;tail=tail->next;}
然后讓cur繼續往后遍歷。
當找到原鏈表中節點值為val的節點是時,就刪除:
struct ListNode* tmp=cur;cur=cur->next;free(tmp);
這里加一個尾指針的判斷
if(tail){tail->next=NULL;}
最后直接返回新節點的頭指針。
3.2 帶哨兵位
使用帶哨兵位的新鏈表, newhead=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
就不需要判斷新鏈表是否為空。
其它地方都與不帶哨兵位一樣,不過最后得把申請的哨兵位釋放掉,返回的是哨兵位的后一個節點。
struct ListNode* tmp=newhead;newhead=newhead->next;free(tmp);return newhead;
4. 附代碼
4.1 不帶哨兵位
struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* newhead=NULL;struct ListNode* tail=NULL;struct ListNode* cur=head;while(cur){if(cur->val!=val){if(newhead==NULL){newhead=cur;tail=cur;}else{tail->next=cur;tail=tail->next;}cur=cur->next;}else{struct ListNode* tmp=cur;cur=cur->next;free(tmp);}}if(tail){tail->next=NULL;}return newhead;
}
4.2 帶哨兵位
struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* newhead=NULL;struct ListNode* tail=NULL;struct ListNode* cur=head;newhead=tail=(struct ListNode*)malloc(sizeof(struct ListNode));while(cur){if(cur->val!=val){tail->next=cur;tail=tail->next;cur=cur->next;}else{struct ListNode* tmp=cur;cur=cur->next;free(tmp);}}tail->next=NULL;struct ListNode* tmp=newhead;newhead=newhead->next;free(tmp);return newhead;
}