剑指offer面试题18:删除链表中重复的节点-java

来源:互联网 发布:mysql统计不重复数据 编辑:程序博客网 时间:2024/06/05 19:19

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:用递归删除,遇到相同的往后走,返回第一个不相同的节点

public class DeleteDuplication {    public  ListNode deleteDuplication(ListNode head){        // 只有0个或1个结点,则返回        if (head ==null||head.next==null){            return head;        }        // 当前结点是重复结点        if (head.val == head.next.val){            ListNode pNode = head.next;            while (pNode != null && pNode.val == head.val){                // 跳过值与当前结点相同的全部结点,找到第一个与当前结点不同的结点                pNode = pNode.next;            }            // 从第一个与当前结点不同的结点开始递归            return deleteDuplication(pNode);        } else {            // 当前结点不是重复结点,保留当前结点,从下一个结点开始递归            head.next = deleteDuplication(head.next);            return  head;        }    }    public static void main(String[] args){        ListNode a = new ListNode(1);        ListNode b = new ListNode(2);        ListNode c = new ListNode(3);        ListNode d = new ListNode(3);        ListNode e = new ListNode(4);        ListNode f = new ListNode(4);        ListNode g = new ListNode(5);        a.next=b;        b.next=c;        c.next=d;        d.next=e;        e.next=f;        f.next=g;        DeleteDuplication A = new DeleteDuplication();        ListNode head = A.deleteDuplication(a);        System.out.print(head.val);    }}
原创粉丝点击