[LeetCode]Remove Duplicates from Sorted List II

题目描述

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;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值