题目来源
https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
示例
链表1->2->3->3->4->4->5
处理后为 1->2->5
解题思路
- 将不重复的节点串到另一个链表,最后返回另一个链表即可
注:在处理重复节点时,会将一组相同节点的最后一个串进新链表,但是新链表的遍历节点cur1
的位置没有移动。只有出现不重复节点时,才会移动cur1
使得重复节点被覆盖。
图解
- 初始未经处理的链表和
pHead
位置
- 遍历完成
-
- 原链表和
pHead
位置
- 原链表和
-
- 最后返回的链表和遍历节点
cur1
位置
- 最后返回的链表和遍历节点
实现代码
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public ListNode deleteDuplication(ListNode pHead) {
if (pHead == null) {
return pHead;
}
//用来标志新链表的头节点,方便最后给返回值
ListNode newHead = new ListNode(-1);
//newHead链表的遍历节点
ListNode cur1 = newHead;
while (pHead != null) {
if (pHead.next != null && pHead.val == pHead.next.val) {
while (pHead.next != null && pHead.val == pHead.next.val) {
pHead =pHead.next;
}
pHead = pHead.next;
//此处虽然把重复的节点加进了新链表,但是最后覆盖掉了因为cur1位置没变
cur1.next = pHead;
} else {
cur1.next =pHead;
cur1 = cur1.next;
pHead =pHead.next;
}
}
return newHead.next;
}