LeetCode - interleaving-stringremove-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,
Given1->2->3->3->4->4->5, return1->2->5.
Given1->1->1->2->3, return2->3.

题意:

给定一个已排序的链表,删除所有具有重复编号的节点,只留下与原始列表不同的编号。

解题思路:

一个辅助的头指针 dummy

一个 前驱指针 pre

一个指向当前的指针 cur

 

先判断值是否相等(cur.next != null && cur.next.val == pre.next.val),值相等,cur继续下移,直到值不相等为止,找到这个cur结点

然后判断结点是否相同(pre.next == cur),相同就继续遍历(pre = pre.next),不同就进行删除(pre.next = cur.next)

最后返回dummy.next就行

一般会改到链表头的题目就会需要一个辅助指针,是比较常见的技巧

 

举个例子:

-1 -> 1 -> 1 -> 1 -> 2 -> 3
此时,执行完内部的while循环后,cur指向第三个1,pre指向-1,那么我们判断pre->next (指向第一个1)和 cur,是不相同的,虽然结点值相同,都是1,但确是不同的结点,所以1全要跳过,那么-1后面要直接连上2。
但如果是下面这个链表:
-1 -> 1 ->2 -> 3
此时,执行完内部的while循环后,cur指向1,pre指向-1,那么我们判断pre->next 和 cur 是相同的,所以不能跳过1,那么直接让pre向后移动一个即可。

 

public ListNode deleteDuplicates(ListNode head) {
        if(head == null) {
        	return null;
        }
        
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode pre = dummy;
        ListNode cur = head;
        
        while(cur != null) {
        	
        	while(cur.next != null && cur.next.val == pre.next.val) {
        		cur = cur.next;
        	}
        	
        	if(pre.next == cur) {
        		pre = pre.next;
        	}
        	else {
        		
        		pre.next = cur.next;
        	}
        	 
        	cur = cur.next;
        }
        
        return dummy.next;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值