剑指offer:76-题解 | #删除链表中重复的结点#

删除链表中重复的结点

http://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef

题目描述


alt alt


示例1
输入: {1,2,3,3,4,4,5}
返回值: {1,2,5}


题解1:使用双指针

首先一个比较「直观且通用」的思路是,采用「边遍历边构造」的方式:

建一个虚拟头节点myhead 以减少边界判断,往后的答案链表会接在 myhead 后面;

通过原输入的 pHead 指针进行链表扫描。 对原链表进行遍历,只要原链表尚未到达结尾,我们就重复如下决策(保留/跳过逻辑).

图示来自宫水三叶的刷题日记,在此引用

  • 「当前节点」与「下一节点」值不同,当前节点进行保留:
    alt
  • 「当前节点」与「下一节点」值相同,跳过「相同的连续一段」,当前节点不能保留:
    alt

代码

   ListNode* myhead = new ListNode(-1);
    myhead->next = pHead;
    ListNode* pre = myhead;
    ListNode* cur = pHead;
    ListNode* temp = NULL;
    while (cur)
    {
        if (cur->next && cur->val == cur->next->val) {
            //先找到第一次重复的元素
            temp = cur;//找到重复元素
            cur = cur->next;//cur指向第二个重复的元素
            //delete cur;//释放空间牛客网中不需要释放空间,但实际需要
            while (cur->next && cur->next->val == cur->val)//多个元素重复
            {
                temp = cur;
                cur = cur->next;//指向最后一个重复的元素
                //delete temp;牛客网中不需要释放空间,但实际需要
            }
            //第一次重复的所有元素找完
            temp = cur;//temp指向最后一个重复的元素
            cur = cur->next;//cur指向最后一个重复元素的下一个节点
            pre->next = cur;//每当重复元素找完之后,pre.next要指向不重复元素的节点
        }
        else {
            pre = cur;//元素不重复,要向下移动指针
            cur = cur->next;
        }
        //只要cur不为空,循环查找有序链表中的重复元素的节点,并删除
    }
    temp = myhead->next;
   // delete myhead;牛客网中不需要释放空间,但实际需要
    return temp;
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务