1. 程式人生 > 其它 >LeetCode-203:移除連結串列元素

LeetCode-203:移除連結串列元素

技術標籤: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; } }