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

Posted xiexinbei0318

tags:

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

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

 

A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点

    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head

  用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针

/*
struct ListNode 
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) 
    
;
*/
class Solution 
public:
    ListNode* deleteDuplication(ListNode* pHead)
    
        if((pHead == nullptr) || (pHead->next == nullptr))
        
            return pHead;
        
        //因为没有传二级指针进来,且头结点也有可能被删除,所以构建一个新结点Head
        ListNode *Head = new ListNode(0);
        Head->next = pHead;
        
        ListNode *pPrev = Head;
        ListNode *pNode = pHead;
        while(pNode != nullptr)
        
            bool flag_repeat = false;//判断是否有重复结点
            if((pNode->next != nullptr) && (pNode->val == pNode->next->val) )
            
                flag_repeat = true;
            
       //没有重复节点 if(flag_repeat == false) pPrev = pNode; pNode = pNode->next;
       //有重复节点 else ListNode *pDelete = pNode; //重复的节点不保留 while((pNode->next != nullptr) && (pNode->val == pNode->next->val)) pNode = pNode->next; //只删了原来的那个 delete pDelete; pDelete = pNode; pPrev->next = pNode->next; pNode = pNode->next; //删第二个 delete pDelete; pDelete = pNode; return Head->next; ;

  

 

技术图片

 

 

相关题目:

  编程实现单链表的逆转函数:实现单链表的逆转函数,输入一个链表,反转链表后,返回翻转之后的链表。

  找出单链表中的一个节点,该节点到尾指针的距离为K:找出单向链表中的一个节点,该节点到尾指针的距离为K。链表的倒数第0个结点为链表的尾指针。要求时间复杂度为O(n)。

  每K个一组反转链表:给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

  

 

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

剑指offer-18-2. 删除链表中重复的结点

剑指offer链表题的双指针法总结

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

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

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

剑指offer——面试题18.1:删除链表中重复的节点