首页 > 其他 > 详细

203. Remove Linked List Elements

时间:2018-05-22 20:28:22      阅读:185      评论:0      收藏:0      [点我收藏+]
 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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!