題目描述:
在一個排序的鏈表中,存在重復的節點,請洗掉該鏈表中重復的節點,重復的節點不保留,回傳鏈表頭指標,例如,鏈表1->2->3->3->4->4->5處理后為1->2->5
示例描述:
輸入:{1,2,3,3,4,4,5}
回傳值:{1,2,5}
- 最后一個節點不是重復的節點的情況:

- 最后一個節點也是重復的節點的情況:

此時就需要把最后的節點的next置為null,所以最后要增加一步,無論是這兩種中的那種情況,一律在最后加一個tmp.next = null;
個人理解:
- 該題的新穎方法是引入了一個虛擬頭結點,虛擬頭結點是計算程序中鏈表的頭結點,但是在最后回傳的時候不將它作為真實的頭結點回傳,而是將它舍棄,將它后面的一個節點作為真實的頭節點回傳,說白了只是為了方便程序操作方便而已,
- 然后要明白兩個while回圈的作用,里面的while回圈可以將連續重復的數字一一跳過,并且能多跳一步,這里自己畫個鏈表體會下,多敲下代碼感受就好了,
題解實作:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
ListNode cur = pHead;
ListNode newHead = new ListNode(-1);//定義一個虛擬頭節點
ListNode tmp = newHead;
while(cur != null){
if(cur.next != null&& cur.val==cur.next.val){//cur.next != null是為了防止空指標例外
while (cur.next!= null&& cur.val == cur.next.val){//這是連續重復的,cur.next!= null也是為了防止空指標例外
cur = cur.next;
}
cur = cur.next;//要多走一步
}else {
tmp.next = cur;
tmp = tmp.next;
cur = cur.next;
}
}
tmp.next = null;//為了防止最后的也是重復的,這樣需要把對應的.next置為null
return newHead.next;//不要虛擬節點,從虛擬節點下一個作為頭結點回傳
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292488.html
標籤:其他
上一篇:非常實用的幾款工具
