剑指offer第二版-18.2删除排序链表中重复的节点

本系列导航:剑指offer(第二版)java实现导航帖

面试题18题目二:删除排序链表中重复的节点

题目要求:
比如[1,2,2,3,3,3],删除之后为[1];

解题思路:
由于是已经排序好的链表,需要确定重复区域的长度,删除后还需要将被删去的前与后连接,所以需要三个节点pre,cur,post,cur-post为重复区域,删除后将pre与post.next连接即可。
此外,要注意被删结点区域处在链表头部的情况,因为需要修改head。

package structure;
/**
 * Created by ryder on 2017/6/13.
 */
public class ListNode<T> {
    public T val;
    public ListNode<T> next;
    public ListNode(T val){
        this.val = val;
        this.next = null;
    }
    @Override
    public String toString() {
        StringBuilder ret = new StringBuilder();
        ret.append("[");
        for(ListNode cur = this;;cur=cur.next){
            if(cur==null){
                ret.deleteCharAt(ret.lastIndexOf(" "));
                ret.deleteCharAt(ret.lastIndexOf(","));
                break;
            }
            ret.append(cur.val);
            ret.append(", ");
        }
        ret.append("]");
        return ret.toString();
    }
}
package chapter3;

import structure.ListNode;

/**
 * Created by ryder on 2017/7/7.
 * 删除排序链表中的重复节点
 */
public class P122_deleteDuplicatedNode {
    public static ListNode<Integer> deleteDuplication(ListNode<Integer> head){
        if(head==null||head.next==null)
            return head;
        ListNode<Integer> pre = null;
        ListNode<Integer> cur = head;
        ListNode<Integer> post = head.next;
        boolean needDelete = false;
        while (post!=null){
            if(cur.val.equals(post.val)){
                needDelete = true;
                post=post.next;
            }
            else if(needDelete && !cur.val.equals(post.val)){
                if(pre==null)
                    head = post;
                else
                    pre.next=post;
                cur = post;
                post = post.next;
                needDelete = false;
            }
            else{
                pre = cur;
                cur = post;
                post = post.next;
            }
        }
        if(needDelete && pre!=null)
            pre.next = null;
        else if(needDelete && pre==null)
            head = null;
        return head;
    }
    public static void main(String[] args){
        ListNode<Integer> head = new ListNode<>(1);
        head.next= new ListNode<>(1);
        head.next.next = new ListNode<>(2);
        head.next.next.next = new ListNode<>(2);
        head.next.next.next.next = new ListNode<>(2);
        head.next.next.next.next.next = new ListNode<>(3);
        System.out.println(head);
        head = deleteDuplication(head);
        System.out.println(head);
    }
}

运行结果

[1, 2, 3]
[1, 2]
[2]

推荐阅读更多精彩内容

  • 本系列导航:剑指offer(第二版)java实现导航帖 面试题18:删除链表的节点 题目要求:在o(1)时间内删除...
    ryderchan阅读 990评论 0 3
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    StarryThrone阅读 3,035评论 0 10
  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 810评论 0 6
  • 1. 慈悲是你最好的武器。 2. 学佛就是在学做人而已。 3. 沈默是毁谤最好的答覆。 4. 你要感谢告诉你缺点的...
    Valentina1989阅读 337评论 0 0
  • 在一个早晨醒来, 我为你写下一句句誓言, 这些誓言, 重复着, 反复地重复着。 我用你为我准备的 软软的毛巾, 擦...
    二马行空阅读 343评论 1 4