剑指Offer 删除链表中重复的结点
题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题步骤:
由于要删除重复节点,所以我们在这里要设置三个节点:
前置节点:pre 用来保存不重复的节点
当前节点:cur 用来保存当前遍历的节点
后置节点:next 用来保存cur后面与其不重复的节点
思路:
(1)pre的初始值为-1,cur初始为pHead,next初始为pHead.next
(2)所以我们采用滑动窗口法来求解
(3)当cur与next不相同时,我们就将pre.next指向cur,cur和next都向都移动一位
(4)当cur与next相同时,我们使用while循环,使next指针向后移动,当移动到next与cur不相等时,此时滑动结束。将cur指向next,next向后移动
(5)外层循环结束的条件是:next==null
代码:
public ListNode deleteDuplication(ListNode pHead) {
if(pHead==null || pHead.next==null)
return pHead;
ListNode head = new ListNode(-1);
ListNode pre = head;
ListNode cur = pHead;
ListNode next = pHead.next;
while(next!=null) {
System.out.println(pre.val+" "+cur.val+" "+next.val);
if(cur.val!=next.val) {
pre.next = cur;
pre = pre.next;
cur = next;
next = next.next;
}
else {
while(next!=null && cur.val==next.val) {
next = next.next;
}
cur = next;
if(next!=null) {
next = next.next;
}
}
}
pre.next = cur;
return head.next;
}