牛客解題思路 刪除鍊錶節點

2021-10-24 01:19:41 字數 1385 閱讀 2031

思路:給定乙個鍊錶,刪除給定的節點。方法很簡單,只要找到給定節點的上乙個節點即可,但是如果我們的輸入只有當前節點呢?那麼我們可以遍歷整個鍊錶,然而這樣的時間複雜度為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....