一,題目描述 在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理后為 1->2->5 二,解決思路 1,創(chuàng)建一個帶傀儡節(jié)點的新鏈表,用來保存原有鏈表中不重復的節(jié)點 2,遍歷給定鏈表將不重復的節(jié)點尾插入新鏈表 3,遍歷分為雙重循環(huán),外層循環(huán)整體循環(huán),內部循環(huán)只是為了跳過連續(xù)幾個相等的元素 三,代碼實現(xiàn)
public ListNode deleteDuplication(ListNode pHead) {
ListNode newHead = new ListNode(-1); //創(chuàng)建一個帶傀儡節(jié)點的新鏈表
ListNode newTail = newHead;
// 循環(huán)遍歷鏈表
ListNode cur = pHead;
while (cur != null) {
// 判定 cur 是否是重復元素
// 時刻牢記, 針對某個引用進行 . 操作的時候, 必須保證該引用不能是 null
// 假設 cur 已經(jīng)指向 最后一個元素了, cur.next 就是 null
// 短路求值. 左側表達式如果為 false, 右側就不求值了(對于邏輯與來說)
if (cur.next != null && cur.val == cur.next.val) {
// 說明 cur 指向的元素就是重復元素, 接下來就需要找到這個重復元素區(qū)間的末尾
// 最終能夠跳過整個重復元素的區(qū)間
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
語言 |
方法 |
3139 |
5XV7WwkL2U |
C0t57 |
何之舟 |
4602 |
2009-09-21 10:13:50 |
// 上面的 while 循環(huán)結束, 此時 cur 就指向這片相同元素區(qū)間的最后一個位置
// 再多走一步就意味著跳過了整個相同元素的區(qū)間
cur = cur.next;
} else {
// 說明 cur 指向的元素不是重復元素
// 把這個元素插入到新鏈表中
newTail.next = new ListNode(cur.val);
newTail = newTail.next;
cur = cur.next;
}
}
return newHead.next;
}
|