題目:在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表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;
}