題目地址:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/java
請編寫一個函數,使其能夠刪除某個鏈表中給定的(非末尾)節點。傳入函數的惟一參數爲 要被刪除的節點 。node
現有一個鏈表 -- head = [4,5,1,9],它能夠表示爲:數據結構
示例 1:函數
輸入:head = [4,5,1,9], node = 5
輸出:[4,1,9]
解釋:給定你鏈表中值爲 5 的第二個節點,那麼在調用了你的函數以後,該鏈表應變爲 4 -> 1 -> 9.學習
示例 2:指針
輸入:head = [4,5,1,9], node = 1
輸出:[4,5,9]
解釋:給定你鏈表中值爲 1 的第三個節點,那麼在調用了你的函數以後,該鏈表應變爲 4 -> 5 -> 9.code
提示:對象
做爲合集中鏈表下的第一題,確實是較簡單的只是一個單元操做,但若是不知道鏈表這種數據結構也仍是是完成不了的。leetcode
鏈表是什麼?get
鏈表是物理存儲單元上非連續的、非順序的存儲結構,數據元素的邏輯順序是經過鏈表的指針地址實現,有一系列結點(地址)組成,結點可動態的生成,也就是包含值與模擬指針(引用)。大概以下:
每一個節點對象除了內容值還有一個引用一共兩個屬性,這樣以來各個節點對象之間就好像鏈接着同樣
class ListNode{ //節點值 int val; //節點指向的下個節點 ListNode next; //構造器 ListNode(int x) { val = x; } }
如今它傳一條鏈表的一個節點,刪除這個節點。由於一個節點的信息只有本身的值以及下個節點。因此傳入一個節點是看不到整個鏈表的。也就是說咱們只能拿到部分鏈就是傳入的節點以後的5--->1--->9
。值爲4的節點是指向5這個節點的,刪除5節點就是讓4節點直接指向1節點就能夠了,但咱們拿不到4節點因此不能改變它的next屬性的值。那麼咱們只能改它指向的節點把它的值由5改爲1再指向9
這樣就不用改變4節點的指向,只是把它指向的這個對象值與next都改掉,那麼4仍是指向0x001只不過是1了,而這個指向的又是0x004就是9,鏈表也就變成了4--->1--->9完成刪除5的操做
public void deleteNode(ListNode node) { //「被刪節點」的值改成下個節點的值 node.val = node.next.val; //指向下下個 node.next = node.next.next; }
開篇第一題主要是考察學習鏈表構成,自己是簡單的但先要了解這樣一個數據結構。