删除链表中重复的节点

Posted chengsheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除链表中重复的节点相关的知识,希望对你有一定的参考价值。

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
 
解题思路:
使用三个指针:preNode指向值没有重复的最后一个节点、nowNode当前的节点、nextNode当前节点的下一个节点。
最开始preNode和nowNode指向头结点,判断nextNode与nowNode当前节点值是否一致,(1)如果一致说明头结点需要改变,我们找到第一个跟头结点值不同的节点,然后将头结点、preNode和nowNode都指向该节点;(2)如果不一致说明头结点没有重复,此时preNode和nowNode都指向头结点,需要让nowNode指向nextNode。
 
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode *preNode, *nowNode, *nextNode;
        preNode = pHead;
        nowNode = pHead;
        nextNode = NULL;
        while(nowNode != NULL){
            nextNode = nowNode->next;
            if(nextNode != NULL){
                if(nextNode->val == nowNode->val){
                    while(nextNode != NULL && nextNode->val == nowNode->val){
                        nextNode = nextNode->next;
                    }
                    if(preNode == nowNode){
                        //头结点需要改变
                        pHead = nextNode;
                        preNode = nextNode;
                        nowNode = nextNode;
                    }else{
                        //删掉中间的重复节点
                        preNode->next = nextNode;
                        nowNode = nextNode;
                    }
                }else{
                    //移动preNode节点到当前节点,nowNode节点指向下一个和当前节点值不同的节点
                    if(nowNode != preNode){
                        preNode = nowNode;
                        nowNode = nextNode;
                    }else{
                        //当前节点指向下一个和当前节点值不同的节点
                        nowNode = nextNode;
                    }
                }
            }else{
                break;
            }
        }
        return pHead;
    }
};

  

以上是关于删除链表中重复的节点的主要内容,如果未能解决你的问题,请参考以下文章

[算法]删除链表中重复的节点

力扣——链表题 203.移除链表元素83.删除排序链表中重复元素82.删除排序链表中重复元素Ⅱ206.反转链表 876.链表的中间节点

删除未排序链表中的所有重复节点

[程序员代码面试指南]链表问题-删除无序链表中重复出现的节点

剑指Offer(链表)-删除链表中重复的节点

求删除链表中重复的节点,重复节点不保留(牛客)