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

【剑指offer】18、删除链表的(重复)节点

时间:2018-07-20 01:09:59      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:code   style   检查   ptr   node   color   时间   public   防止   

题目一

在O(1)时间内删除链表节点,已知删除节点的指针。

思路

关键是已知删除节点的指针,则可以将下一个节点复制到当前节点,再将当前节点指向下下个节点。

这样相当于用到的是 当前节点、下个节点、下下个节点,因此当前节点是尾节点时,下下个节点不存在,此时需要老老实实遍历寻找。

时间复杂度 [(n-1)*O(1) + O(n)] / n = O(1)

代码略。

 

题目二

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

思路

思想很朴素,就双指针不断检查。

唯一需要注意的是,头指针也可能被删除,因此设置一个dummy,这也是链表中经常用的trick

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode* dummy = new ListNode(-1);
        dummy->next = pHead;  //设置头节点,防止头节点被删除
        ListNode* head = pHead, *pre = dummy, *pNext = nullptr;
        while (head  && head->next)
        {
            pNext = head->next;
            if (head->val == pNext->val)
            {
                while (head->val == pNext->val && pNext) //保证pNext存在,比如当重复直到尾节点时
                {
                    pNext = pNext->next;
                }
                pre->next = pNext;
                head = pNext;
            }
            else{
                pre = head;
                head = head->next;
            }
        }
        return dummy->next;
    }
};

 

【剑指offer】18、删除链表的(重复)节点

标签:code   style   检查   ptr   node   color   时间   public   防止   

原文地址:https://www.cnblogs.com/shiganquan/p/9339125.html

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