您的位置:首页 > 其它

[LeetCode]Remove Duplicates from Sorted List II

2014-05-06 14:28 225 查看

题目描述

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: