LeetCode 82. 删除排序链表中的重复元素 II

72 篇文章 0 订阅
82. 删除排序链表中的重复元素 II

难度 中等

给定一个已排序的链表的头 head删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表

示例 1:

img

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2:

img

输入:head = [1,1,1,2,3]
输出:[2,3]

提示:

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

题解

​ 这道题应该是一道简单的指针操作题,主要通过移动和判断进行。移动时回遇到两种情况,一是当前指针和后面的指针不相同,直接移动指针;二是当前指针和后面的指针相同,要跳过所有指针。所以就针对这两种情况进行判断,然后选择不同的操作。

​ 为了便于理解,需要设置几个辅助变量

  • headNode,头节点,区别头指针head。头结点是为了方便返回结果
  • pre,前驱指针,记录当前节点的前一个指针,方便修改指针
  • now,当前指针,进行移动和判断
  • next,后继指针,进行移动和判断

现在有两个不同的情况

  • 当前指针和后续指针不相同

    指针移动当前指针和前驱指针,pre = now; now = next;

  • 当前指针和后续指针相同

    如果相同了,后面还有可能相同,要一并处理,更新next = next.next; 继续判断,直到不相同(直接while循环)。当判断结束后,pre.next要指向next,再更新now = next。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
//此版本代码不是最优代码,当时一定是好理解的代码
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode hendNode = new ListNode(0, head);//头节点,方便返回
        ListNode pre = hendNode;//前驱指针
        ListNode now = pre.next;//当前指针
        while(now != null){//当前指针不为空
            ListNode next = now.next;//后继指针
            if(next != null){//后继指针不为空
                if(now.val == next.val){//当当前指针和后续指针相同
                    while(next != null && now.val == next.val){//后续不为空,且一直相同
                        next = next.next;//更新next,直到第一个不相同的
                    }
                    pre.next = next;//pre.next指向next,跳过一系列相同节点
                    now = next;//当前指针移动
                }else{//如果不相同,直接移动前驱指针和当前指针
                    pre = now;
                    now = next;
                }
            }else{//猴急指针为空,直接结束循环
                break;
            }
        }
        return hendNode.next;//返回头结点后续节点
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值