101.Remove Duplicates from Sorted List II

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

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

分析:

首先判断链表是否为空。

       1.定义一个新的节点dump,使其指向pHead,最后返回dump.next即可

       2.使得dump到tail结点之间为目前已经确定的结果

       3.q为在剩下的链表的头结点,next为在剩下的链表中找到的第一个符合条件的节点。

        循环2,3直到q为空。

    /**
	 * 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 
	 * 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5.
	 * 首先判断链表是否为空。
	 * 1.定义一个新的节点dump,使其指向pHead,最后返回dump.next即可
	 * 2.使得dump到tail结点之间为目前已经确定的结果
	 * 3.q为在剩下的链表的头结点,next为在剩下的链表中找到的第一个符合条件的节点
	 * 循环2,3知道q为空。
	 */
	public ListNode deleteDuplicates(ListNode pHead){
		if(pHead == null || pHead.next==null){
			return pHead;
		}
		ListNode dump = new ListNode(0);
		dump.next = pHead;
		ListNode tail = dump;
		ListNode q = pHead;
		ListNode next = pHead;
		
		/*遍历链表*/
		while(q!=null){
			next = q;
			next = next.next;
			boolean needDelete = false;//表示某个节点是否需要被删除
			while(next != null && next.val == q.val){
				needDelete= true;//进到这个循环说明该节点有重复的
				next = next.next;
			}
			if(!needDelete){//如果这个节点不需要删除,则把它加到之前选中链表的末尾。
				tail.next = q;
				tail = tail.next;
			}
			q = next;
		}
		
		tail.next = null;
		
		return dump.next;
    }


你可能感兴趣的:(101.Remove Duplicates from Sorted List II)