码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-08-27 19:08:28      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:ret   要求   rev   单向链表   bool   倒数   amp   剑指offer   dup   

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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】删除链表中重复的节点

标签:ret   要求   rev   单向链表   bool   倒数   amp   剑指offer   dup   

原文地址:https://www.cnblogs.com/xiexinbei0318/p/11419901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!