一、题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
二、思路及代码实现
思路:双指针
- 创建双指针 p1、p2,p1 指向当前确定不重复的那个节点,p2 作为工作指针,一直往后面搜索。
- 如果 p2.val = p2.next.val,说明它们就是重复节点,让 p2 指向最后一个重复的节点,执行 p1.next = p2.next 就能删除重复的节点。
- 如果 p2.val != p2.next.val,说明 p2 指向的节点不是重复节点,则将 p1 和 p2 的指针都向后移动一位,继续下一个节点的查看。
注意:
这里创建一个带头节点的新链表,方便处理第一个和第二个节点相同的情况,最后返回 newHead.next 即可。
参考代码:
public class Solution {
public ListNode deleteDuplication(ListNode pHead){
if(pHead == null || pHead.next == null)
return pHead;
ListNode newHead = new ListNode(0);
newHead.next = pHead;
ListNode p1 = newHead;
ListNode p2 = newHead.next;
while(p2 != null){
// 碰到重复元素,让 p2 指向最后一个相同的节点
if(p2.next != null && p2.val == p2.next.val){
while(p2.next != null && p2.val == p2.next.val){
p2 = p2.next;
}
p1.next = p2.next;
p2 = p2.next;
}else{// 不相同,p1 和 p2 都向后移动一位
p1 = p1.next;
p2 = p2.next;
}
}
return newHead.next;
}
}