删除链表中重复的结点

Posted by 代皓 Blog on July 25, 2017

– layout: post title: 删除链表中重复的结点 subtitle:
date: 2017-07-25 author: DH header-img: img/post-bg-alibaba.jpg catalog: true tags: - 算法 - 剑指offer —

题目

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

分析

设置三个指针,first.next指针始终指向链表的开头,这样不管phead如何变化我们都能知道链表的开头。

last指针始终指向上一次搜索开始的地方,当搜索结束,找到不同的元素的时候,以便设置;

phead是一个活动指针。

(1)两两比较,如果phead和phead.next相同,那么有可能接下来连续的数都是相同的;我们的任务就是找到这个结尾

(2)找到一连串相同的节点的结尾;

(3)设置last.next 指向下一个不同的节点;

(4)如果下一个节点不相同,直接last和phead后移

代码

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

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
		
			if (pHead == null) {
				return null;
			}
			
			// 设置一个节点指向头结点
			ListNode firstNode = new ListNode(Integer.MIN_VALUE);
			firstNode.next = pHead;
			// last指针永远指向移动前的扫到的最后一个节点
			ListNode lastNode = firstNode;
			
			while (pHead != null && pHead.next != null) {
					
				if (pHead.val == pHead.next.val ) {
					int val = pHead.val;
					while (pHead != null &&  pHead.val == val) {
						pHead = pHead.next;
					}
					lastNode.next = pHead;
				}else {
					lastNode = pHead;
					pHead = pHead.next;
				}
				
			}
			
			return firstNode.next;
    }
}