剑指offer 删除链表中重复的结点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
 
思路:1、dummy结点的写法是,dummy -> next 等于head,然后将head等于dummy,修改后就是dummy -> next等于原来的head结点,head指向的是dummyNode。最开始的操作都是操作dummy -> next,不要直接操作dummy。
2、使用一个tmp进行删除操作,要注意应该是保存相同的value值,不要保存结点
3、要将pHead -> next != nullptr写在前面,因为pHead -> next 可能为空,这时候取val就会指针越界。逻辑表达式先判断前面的,前面的逻辑false就不会判断后面的表达式了。
while(pHead -> next != nullptr && tmp == pHead -> next  -> val){
pHead -> next = pHead -> next -> next; }
4、开始自己认为没有删除操作,其实联想head = head -> next,此时head就等于下一个结点了,所以上面的while循环过后,pHead -> next等于循环之后的那个结点。有if一定要写相应的else语句。
5、最开始的pnode==nullptr就返回的时候,不要直接写nullptr,应该写return pNode;
 
 1 class Solution {
 2 public:
 3     ListNode* deleteDuplication(ListNode* pHead){
 4         if(pHead == nullptr || pHead -> next == nullptr){
 5             return pHead;
 6         }
 7         //ListNode* cur = pHead;
 8          
 9         ListNode* dummyNode = new ListNode(-1);
10         dummyNode -> next = pHead;
11         pHead = dummyNode;
12          
13         int tmp;
14           
15         while(pHead -> next != nullptr && pHead -> next -> next != nullptr){
16             if(pHead -> next -> val == pHead -> next -> next -> val){
17                 tmp = pHead -> next -> val;
18                 while(pHead -> next != nullptr && tmp == pHead -> next  -> val){
19                     pHead -> next = pHead -> next -> next;
20                 } 
21                  
22             }
23             else{               
24                 pHead  = pHead -> next;
25             }
26              
27         }
28         return dummyNode -> next;
29     }
30 };

 

posted @ 2017-09-12 17:02  zqlucky  阅读(160)  评论(0编辑  收藏  举报