LeetCode-203:移除連結串列元素
阿新 • • 發佈:2021-02-10
技術標籤:LeetCode
題目描述
203.移除連結串列元素
刪除連結串列中等於給定值 val 的所有節點。
示例1:
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
題解
很簡單的一道連結串列習題,定義兩個指標plist和tail,分別指向連結串列的頭結點和頭結點的下一個結點,從tail指標開始一直往後走,如果值不等於val,則 plist指向tail,如果遇到等於val的值,則 tail 繼續往後走即可(相當於跳過該結點)。
初始情況:
①如果 tail->val != val ,則plist的next指向tail,然後tail 繼續向後走
②如果 tail->val == val ,則tail繼續往後走,跳過該結點
跳過後,原連結串列的連線就會變成這樣:
③重複②③過程,直到tail->next == NULL 為止(代表tail已經走完了該連結串列)
題解程式碼
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
if(head==NULL){
//結點為空
}
else if(head->next == NULL)
{
//結點只有一個
if(head->val == val)
return NULL;
else
return head;
}
else{ //結點為多個
//使第一個值不為val
while(head->val == val){
head=head-> next;
if(head == NULL)
return NULL;
}
struct ListNode* plist = head;
struct ListNode* tail = head->next;
while(tail){
//如果值不相等,plist指向tail,
if(tail->val!=val)
{
plist->next = tail;
tail = tail->next;
plist=plist->next;
}
else{
tail=tail->next;
}
}
//跳出迴圈表示,tail已經遍歷完了
plist->next = NULL;
return head;
}
}