zoukankan      html  css  js  c++  java
  • 删除链表中重复的结点

    python

    class Solution:
        def deleteDuplication(self,pHead):
            if not pHead or not pHead.next:
                return pHead
            //返回无重复第一个节点
            if pHead.val == pHead.next.val:
                pnode = pHead.next.next
                while pnode and pnode.val==pnode.next.val:
                    pnode = pnode.next.next
                //这个时候第一个pnode.val != pnode.next.val
                //return 的意思是,再次迭代pnode.val==pnode.next.val的情况,一直到没有相等的时候执行else
                #此时应该会相同所有相同结点的下一个,这个时候继续将这个节点进行迭代
                #注意,要返回的是删除了相同结点后下一个结点
                return self.deleteDuplication(pnode)
            else:
                #如果这个节点和下一个结点不一样,那就继续把下一个结点送入到函数中
                #返回的应该是不同节点的第一个个,所以返回phead
                pHead.next = self.deleteDuplication(pHead.next)
                return pHead
        

    c++

     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;//delete指针之后,只是回收指针指向位置的空间,指针的值不变,所以还要讲指针设置为null
    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 };

     自己修改了一点点

     1 struct ListNode {
     2     int val;
     3     struct ListNode *next;
     4     ListNode(int x) :
     5         val(x), next(NULL) {
     6     }
     7 };
     8 */
     9 class Solution {
    10 public:
    11     ListNode* deleteDuplication(ListNode* pHead)
    12     {
    13         if(!pHead || !pHead->next) return pHead;
    14         ListNode* new_head = new ListNode(-1);
    15         new_head->next = pHead;
    16         ListNode* pre = new_head;
    17         ListNode* cur = pHead;
    18         ListNode* nex = pHead->next;
    19         while(cur && nex){
    20             if(cur->val ==nex->val){
    21                 while(nex && nex->val==cur->val){
    22                     ListNode* temp = nex;
    23                     nex = nex->next;
    24                     delete temp;//delete只是删除了指针指向的位置的空间,指针本身的值没有改变,所以要再设置成null,不然出现野指针现象
    25                     temp = nullptr;
    26                 }
    27                 pre->next = nex;
    28                 cur = nex;
    29                 nex = nex->next;
    30             }
    31             else{
    32                 pre = cur;
    33                 cur = nex;
    34                 nex = nex->next;
    35             }
    36         }
    37         pHead = new_head->next;
    38         delete new_head;
    39         return pHead;
    40     }
    41 };
  • 相关阅读:
    JAVA入门之开发环境搭建
    webpack 打包json文件,报 Unexpected token, expected ";"错误解决方案
    node.js Linux下Date.prototype.toLocaleString()仅支持英文的坑
    Javascript高级程序设计之DOM
    JavaScript高级程序设计之客户端检测
    JavaScript高级程序设计之事件
    JavaScript高级程序设计之BOM
    JavaScript高级程序设计之函数表达式
    JavaScript高级程序设计之面向对象程序设计
    FileReader对象——如何实现File中数据的读取
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11085037.html
Copyright © 2011-2022 走看看