剑指offerNo56. 删除链表中重复的结点(Java)

守給你的承諾、 提交于 2020-03-01 16:41:10

题目描述:

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

思路:

遍历节点的同时判断当前节点与下一个节点是否相同,如果相同则删除,
删除方法  使用相同节点的前一个节点,指向相同节点的下一个节点

代码:

package offer01;

public class TestNo56 {
    static class ListNode{
        int val ;
        ListNode next = null;
        ListNode(int val){
            this.val = val;
        }
        public String toString(){
            if(this.next == null){
                return String.valueOf(this.val);
            }else{
                return this.val+ "->" + this.next.toString();
            }
        }
    }
    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode node1 = new ListNode(2);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        head.next = node1;
        node1.next = node2;
        node2.next = node3;
        System.out.println(new TestNo56().deleteDuplication(head));
    }
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null){
            return null;
        }
        //注意备用头节点,头节点可能被删除
        ListNode first = new ListNode(-1);
        first.next = pHead;
        ListNode p = pHead;
        //前节点
        ListNode preNode = first;
        while (p !=null && p.next!=null){
            if(p.val == p.next.val){//两个节点相等
                int val = p.val;//记录val的值,用于判断后面是否相等
                while (p != null && p.val == val){
                   p = p.next;
                }
                preNode.next = p;
                }else{
                preNode = p;
                p = p.next;
            }

            }
            return first.next;
    }

}

 

希望开心和好运都奔向我,我们撞个满怀  ..

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!