剑指offer:删除链表中重复的结点

题意描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。

输入描述

输入:1->2->3->3->4->4->5

输出:1->2->5

解题思路

一、非递归

遍历链表,使用pre指针保存当前节点,使用last指针保存下一个节点。

  1. last.val == last.next.val时,向后遍历,找到last.val != last.next.val的节点,连接节点pre.next = last.next
  2. last.val != last.next.val时,更新prelast节点。
  3. 使用head节点保存头节点,防止出现一开始出现重复节点的情况。
    public ListNode deleteDuplication(ListNode pHead){
            if(pHead == null || pHead.next == null) return pHead;
            ListNode head = new ListNode(0);
            head.next = pHead;	//保存头节点
            ListNode pre = head;	//当前节点
            ListNode last = head.next;	//下一节点
            while(last != null){
                if(last.next != null && last.val == last.next.val){
                    while(last.next != null && last.val == last.next.val){
                        last = last.next;	//找到重复节点的最后一个节点
                    }
                    pre.next = last.next;	//当前节点的下一节点 = 重复节点的最后一个节点的下一节点
                    last = last.next;	//更新last节点
                }else{		//last.val != last.next.val
                    pre = pre.next;		//更新当前节点
                    last = last.next;	//更新下一个节点
                }
            }
            return head.next;	//返回头节点
    }

二、递归

使用last指针保存下一节点。

  1. 如果pHead.val == last.val,说明当前节点 = 下一节点。向后找到第一个与当前节点不同的节点,并进入递归,判断新节点是否重复。
  2. pHead.val != last.val,进入递归,将当前节点与下一节点连接,并返回当前节点。
  3. 最后返回头节点。
    public ListNode deleteDuplication(ListNode pHead){
            if(pHead == null || pHead.next == null) return pHead;
            ListNode last = pHead.next;	//保存下一节点
            if(pHead.val == last.val){	//当前节点 = 下一节点
                while(last!=null && pHead.val==last.val){
                    last = last.next;	//找到第一个不重复的节点
                }
                return deleteDuplication(last);	//进入递归,判断下一节点是否重复
            }else{	//当前节点 != 下一节点
                pHead.next = deleteDuplication(pHead.next);	//将两个节点连接
                return pHead;	//连接后返回当前节点
            }
    }
posted @ 2020-04-22 14:02  灵图  阅读(95)  评论(0)    收藏  举报