思路:給定乙個鍊錶,刪除給定的節點。方法很簡單,只要找到給定節點的上乙個節點即可,但是如果我們的輸入只有當前節點呢?那麼我們可以遍歷整個鍊錶,然而這樣的時間複雜度為o(n),如果我們需要o(1)的時間複雜度呢?
如果該節點不是尾節點,那麼可以直接將下乙個節點的值賦給該節點,然後令該節點指向下下個節點,再刪除下乙個節點。否則,就需要先遍歷鍊錶,找到節點的前乙個節點,然後讓前乙個節點指向 null。
public listnode deletenode
(listnode head, listnode tobedelete)
else
}return head;
}
注意!!!!!!!這裡如果該節點是尾節點,直接將其置為null是不可取的!!!!因為此時鍊錶並沒有發生變化,只是tobedelete指向了null(不指向任何記憶體位址)。
思路:在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5。
注意這裡是把所有的重複節點都刪除了,而不是保留多個重複節點中的乙個。
一種簡單的想法就是我們用乙個指標來遍歷鍊錶,還需要乙個pre指標來指向前乙個不一樣的節點,只要遇到不同的節點,兩個指標同時移動,如果遇到下乙個節點和當前節點值一樣,則直接pre.next = cur.next來刪除中間重複節點,為了牽住鍊錶,我們再定義乙個頭節點head指向phead:
public listnode deleteduplication
(listnode phead)
//cur = cur.next;
= cur;
pre.next = cur.next;
cur = cur.next;
}else
}return head.next;
}
上面注釋掉的寫法也是ok的。另外,這一題也可以用遞迴法解題,我們只需要考慮當前節點和下乙個節點相同或者不同的情況,不同則保留當前節點並開始判斷下乙個節點,相同則刪除該節點,一直刪除到遇到不同節點(這裡的刪除不是真正意義上的刪除,而是直接改變了返回的「頭節點」,因為這裡遞迴的返回值就是節點,跳過某些節點即為刪除):
public listnode deleteduplication
(listnode phead)
if(phead.val == phead.next.val)
return
deleteduplication
(pnode)
;// 從第乙個與當前結點不同的結點開始遞迴
}else
}
牛客解題思路 從尾到頭列印鍊錶
思路 最簡單的一種想法就是遍歷鍊錶,用棧來儲存資料,然後從棧中取出,比較簡單 public arraylist printlistfromtailtohead listnode listnode arraylist ret newarraylist while stack.isempty ret.a...
牛客網 刪除鍊錶中重複的節點(鍊錶)
題目 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 知識點 鍊錶思路 1.首先新增乙個頭節點,防止碰到第乙個,第二個節點就相同的情況 2.設定 pre current指標,pre指標指向當前...
牛客刷題鍊錶之刪除鍊錶中重複的節點
在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 目前提供兩種方式,第一種通過乙個前指標和當前指標,找到重複節點並刪除 第二種1.首先新增乙個頭節點,以方便碰到第乙個,第二個節點就相同的情況2....