[LeetCode]Remove Duplicates from Sorted List II

来源:互联网 发布:单片机lcd1602显示汉字 编辑:程序博客网 时间:2024/05/19 20:58

题目描述

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

给定一排好序的链表,去除其中具有相同值的节点

解题思路

相对于Remove Duplicates from Sorted List,此题加深了一步,是去除链表中具有相同值的所有节点。

为解决此题,考虑到一下几种情况:

i)无重复节点


ii)重复节点在链表头部



iii)重复节点在链表中部



代码

针对上述三种情况,我们需要用四个变量来完成题目要求:
                ListNode newHead = head;// 新的头节点初始化
ListNode lastNode = head;// 倒数第一个无重复节点
ListNode secondNode = null;// 记录倒数第二个无重复节点
int dup = 0;// 判断当前节点是否是重复节点

具体实现如下:
public static ListNode deleteDuplicates(ListNode head) {if (head == null || head.next == null) {return head;}ListNode node = head.next;ListNode newHead = head;// 新的头节点初始化ListNode lastNode = head;// 倒数第一个无重复节点ListNode secondNode = null;// 记录倒数第二个无重复节点int dup = 0;// 判断当前节点是否是重复节点while (node != null) {dup = 0;while (node != null && node.val == lastNode.val) {dup++;lastNode.next = node.next;// 重复的则将上一个无重复节点指向当前重复节点的下一个节点node = node.next;}if (dup > 0) {if (lastNode == newHead) {// 如果上一个无重复节点是头节点,并且在此轮循环中是重复节点,则重置头节点newHead = node;secondNode = null;} else {// 如果上一个无重复节点是头节点,并且在此轮循环中是重复节点,则将倒数第二个无重复节点指向当前节点secondNode.next = node;}} else {//如果此轮循环无重复节点,则将倒数第一个无重复节点赋值给倒数第二个无重复节点secondNode = lastNode;}if (node != null) {lastNode = node;node = node.next;}}return newHead;}


0 0
原创粉丝点击