刪除鏈表中重複的節點(重點)

題目:在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5

思路:遍歷節點的同時判斷當前節點與下一個節點是否相同,如果相同則刪除。 刪除方法 使用相同節點的前一個節點,使其指向相同節點的下一個節點。

 

pPre:上一個不重複的結點;pCur:當前結點;pNxt:當前結點的下一個結點。若pCur結點的值和pNxt的值相等,則移動pCur和pNxt,直到pCur的值改變。則此時應刪除pPre和pCur之間的所有結點。

public ListNode deleteDuplication(ListNode pHead) {
		if(pHead==null)  //傳入鏈表爲空,直接返回null
			return null;
		ListNode first = new ListNode(-1);//備用頭結點,因爲原始頭結點可能被刪除
		first.next = pHead;
		ListNode pPre = new ListNode(0);
		ListNode pCur = new ListNode(0);
		pPre = first;
		pCur = pHead;
		
		
		while(pCur!=null&&(pCur.next!=null)) {
			if(pCur.val==pCur.next.val) {// 如果重複
				int val = pCur.val; //用於記錄當前重複的值
				while(pCur!=null&&val==pCur.next.val) {  //循環找到值不同的val的結點
					pCur = pCur.next;
				}
				pPre.next = pCur; //刪除重複結點
			}
			else {//如果當前結點和當前結點的next的值不相等,則pPre和pCur同時移動
				pPre = pPre.next;
				pCur = pCur.next;
			}
		}
		return first.next;
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章