剑指offer 56.删除有序链表中的重复结点

Posted hi3254014978

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer 56.删除有序链表中的重复结点相关的知识,希望对你有一定的参考价值。

56. 删除有序链表中的重复结点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

分析

借助辅助头结点,可避免单独讨论头结点的情况。设置两个结点 pre 和 cur,当 cur 和 cur.next 值相等,cur 一直向前走,直到不等退出循环,这时候 cur 指的值还是重复值,调整 cur 和 pre 的指针再次判断

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
 1 public class Solution {
 2     public ListNode deleteDuplication(ListNode pHead)
 3     {
 4         if(pHead == null || pHead.next == null){
 5             return pHead;
 6         }
 7         
 8         // 每访问一个结点,循环判断是否重复
 9         ListNode cur = pHead;    // 指向当前结点
10        // 创建一个辅助头结点,指向前一个元素的指针,方便删除
11         ListNode head = new ListNode(Integer.MIN_VALUE);
12          head.next = pHead;
13         ListNode pre = head;
14        
15         while(cur != null){
16             if(cur.next != null && cur.val == cur.next.val){
17                 // 如果重复,一直后移,直到找到不相等的结点
18                 while(cur.next != null && cur.val == cur.next.val){
19                     cur = cur.next;
20                 }
21                 cur = cur.next;    // 这个cur所指结点即是下一个不重复的结点
22                 pre.next = cur;
23             }else{
24                 pre= cur;
25                 cur = cur.next;
26             }
27         }
28         return head.next;
29     }
30 }

 

以上是关于剑指offer 56.删除有序链表中的重复结点的主要内容,如果未能解决你的问题,请参考以下文章

[剑指offer] 56. 删除链表中重复的结点

[剑指offer] 56. 删除链表中重复的结点

剑指Offer-代码的完整性面试题18.2:删除链表中的重复节点

剑指offer五十六之删除链表中重复的结点

《剑指offer》:[57]删除链表中重复的结点

剑指offer-18-2. 删除链表中重复的结点