【劍指offer】刪除鏈表中重復的節點,C++實現(鏈表)


0.簡介

      本文是牛客網《劍指offer》筆記。

1.題目

      在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。例如,鏈表1->2->3->3->4->4->5 處理后為 1->2->5

 

2.思路

      鏈表有0個節點

      鏈表有1個節點

      鏈表有2個以上節點

      三個指針和兩層循環實現刪除鏈表中重復的節點。

      首先,檢查邊界條件(鏈表有0個節點或鏈表有1個節點)時,返回頭結點;其次,避免由於第一個節點是重復節點而被刪除,新建一個指向頭結點的節點;再次,建立三個指針pre/p/next,分別指向當前節點的前序節點、當前節點、當前節點的后續節點;最后循環遍歷整個鏈表,如果節點p的值和節點next的值相同,則刪除節點p和節點next,pre和下一個沒有重復的節點連接。如果節點p的值和節點next的值不同,則三個指針向后移動一個指針。

3.code

  1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6         val(x), next(NULL) {
 7     }
 8 };
 9 */
 10 class Solution {
 11 public:
 12     ListNode* deleteDuplication(ListNode* pHead)
 13     {
 14           // 鏈表有0個/1個節點,返回第一個節點
 15           if(pHead==NULL||pHead->next==NULL)
 16               return pHead;
 17           else
 18           {
 19               // 新建一個頭節點,防止第一個結點被刪除
 20               ListNode* newHead=new ListNode(-1);
 21               newHead->next=pHead;
 22 
 23               // 建立索引指針
 24               ListNode* p=pHead;      // 當前節點
 25               ListNode* pre=newHead;  // 當前節點的前序節點
 26               ListNode* next=p->next;    // 當前節點的后序節點
 27 
 28               // 從頭到尾遍歷編標
 29               while(p!=NULL && p->next!=NULL)
 30               {
 31                   if(p->val==next->val)//如果當前節點的值和下一個節點的值相等
 32                   {
 33                       // 循環查找,找到與當前節點不同的節點
 34                       while(next!=NULL && next->val==p->val)
 35                       {
 36                           ListNode* temp=next;
 37                           next=next->next;
 38 
 39                           // 刪除內存中的重復節點
 40                           delete temp;
 41                           temp = nullptr;
 42 
 43                       }
 44 
 45                     pre->next=next;
 46                     p=next;
 47                   }
 48                   else//如果當前節點和下一個節點值不等,則向后移動一位
 49                   {
 50                       pre=p;
 51                       p=p->next;
 52                   }
 53                   next=p->next;
 54               }
 55            return newHead->next;//返回頭結點的下一個節點
 56           }
 57     }
 58 };


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM