截止到目前我已經寫了 600多道演算法題,其中部分已經整理成了pdf檔案,目前總共有1000多頁(并且還會不斷的增加),大家可以免費下載
下載鏈接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取碼:6666


這題說了鏈表中的值是按照升序排列的,既然是排過序的,那么相同的節點肯定是挨著的,我們可以使用一個指標cur,每次都要判斷是否和他后面的節點值相同,如果相同就把后面的那個節點給洗掉,這里就以示例2為例來看個視頻
視頻鏈接

最后再來看下代碼
public ListNode deleteDuplicates(ListNode head) {
//如果但前節點是空,或者是單個節點,直接回傳
if (head == null || head.next == null)
return head;
//只用一個指標cur指向當前節點
ListNode cur = head;
while (cur.next != null) {
//如果當前節點的值和下一個節點的值相同,
//就把下一個節點值給洗掉
if (cur.val == cur.next.val) {
cur.next = cur.next.next;
} else {
//否則cur就往后移一步
cur = cur.next;
}
}
return head;
}
遞回方式解決
除了上面使用一個指標以外,我們還可以使用遞回的方式來解決

最后再來看下代碼
public ListNode deleteDuplicates(ListNode head) {
//遞回的邊界條件判斷
if (head == null || head.next == null)
return head;
//遞回,相當于從后往前遍歷
head.next = deleteDuplicates(head.next);
//如果當前節點和下一個一樣,直接回傳下一個節點,否則
//回傳當前節點
return head.val == head.next.val ? head.next : head;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323442.html
標籤:其他
