1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 static int wing=[]() 10 { 11 std::ios::sync_with_stdio(false); 12 cin.tie(NULL); 13 return 0; 14 }(); 15 16 class Solution 17 { 18 public: 19 ListNode* removeElements(ListNode* head, int val) 20 { 21 if(head==NULL) 22 return NULL; 23 ListNode *pre=new ListNode(0); 24 pre->next=head; 25 ListNode *fon=head; 26 while(fon!=NULL) 27 { 28 if(fon->val!=val) 29 { 30 pre->next->val=fon->val; 31 pre=pre->next; 32 } 33 fon=fon->next; 34 } 35 pre->next=NULL; 36 return (head->val==val)? NULL:head; 37 } 38 };
新建一个头结点,方便算法实现。和数组删除给定值类似,不删除节点,不改变指针,而是覆盖节点值。通过覆盖节点值来达到压缩链表,实现删除给定值。
一个前指针指向覆盖节点前驱,一个后指针扫描链表。扫到非指定值,则将其赋给前指针的后继,扫到指定值,则仅仅移动后指针,继续扫描直到扫描完整个链表。
扫完之后,将前指针的next置为NULL
最后可能有两种状态,一种状态是链表全为给定值时,pre的next域指向head,head指向节点值为给定值,next域为NULL
另一种状态是head指向第一个不为给定值的节点,pre指向最后一个不为给定值的节点,且pre的next域为NULL
判定最后为哪种状态,返回相应值即可。
203. Remove Linked List Elements
原文:https://www.cnblogs.com/zhuangbijingdeboke/p/9073725.html