鍊錶由乙個個節點連線而成的,即乙個個物件,該物件包含兩個屬性:節點值、下乙個節點的引用。同時也可以看到value屬性是用來儲存實際資訊的,而next屬性是用來建立節點間的聯絡。對於雙向鍊錶,需要兩個這樣的屬性來指向前面節點和後面節點。
public
class
listnode
}
*鍊錶是乙個帶頭大哥,拉著一群小弟。*所以先找到帶頭大哥,然後順藤摸瓜往後揪出所有小弟。小弟的數量也是有限的,最後乙個小弟的next屬性為null時,表示不再指向其它小弟了,即鍊錶結束了。
public
static
void
printlist
(listnode pnode)
while
(pnode != null)
}
可以模擬陣列的遍歷操作去理解,arr.length == 0
與pnode == null
都是表示陣列或鍊錶中沒有元素這種情況。陣列中遍歷元素的方式:
int i =0;
while
(i != arr.length)
鍊錶中遍歷元素的方式:
while
(pnode != null)
對比發現,陣列和鍊錶都具有流動性,即從頭到尾的索引變化。陣列受長度限制,而鍊錶受當前節點是否存在限制。
在陣列中刪除的思想是覆蓋,先找到被刪除元素的位置,然後將其後的元素向前移動一位。而鍊錶中就不是覆蓋了,思路是,先找到要刪除節點的前乙個節點prenode
,然後由當前節點curnode
找到它的下個節點afternode = curnode.next
,再將prenode.next = afternode
,最後釋放curnode
節點的空間。這是由鍊錶這種資料結構決定的,只用改變鍊錶的指向,再釋放被刪節點的空間。
public
static
void
deletenode
(listnode phead, listnode ptobedeleted)
listnode aimnode = curnode.next;
//目標節點
pre.next = aimnode;
//前節點指向目標節點
}
在鍊錶的操作中,要明白curnode = curnode.next;
跟陣列中i ++
的目的是一樣的。這種方法需要先找到被刪節點的前乙個節點,這需要0(n)
的時間複雜度。有沒有0(1)
的解法內,我們想想鍊錶中有效的東西是value
值不同,next
只起到串聯的作用。
我們可以這樣做,既然入參傳入被刪除的節點,可拿到它後乙個節點pnext=ptobedeleted.next
將有乙個節點value值賦給要刪除節點ptobedeleted.value =pnext.value
,這樣就不用遍歷刪除pnext
即可。
public
static
void
deletenode1
(listnode phead, listnode ptobedeleted)
listnode pnext = ptobedeleted.next;
listnode pnextnext = pnext.next;
ptobedeleted.value = pnext.value;
ptobedeleted.next = pnextnext;
//要刪節點指向下下個節點
}
這有點像陣列中覆蓋刪除元素。
鍊錶中最多的是指標操作,搞清每個指標的定義,維持他們之間的不變關係。題目鏈結
三個指標解法
public listnode reverselist(listnode head)
// 最後pre到達的位置剛好是最末尾那個結點,即反轉後的頭結點
return pre;
}
解題思想
設定三個指標,分別指向當前乙個節點、當前節點、後乙個節點。當前節點的next本來是指向它的後乙個節點的。現在讓它指向它前乙個節點,就實現了鍊錶的反轉。但是當前節點與它後乙個節點連線就斷開了,因此在反轉鍊錶之前需要儲存當前節點的下個節點。以便鍊錶反向的過程中向前推進(當前指標和前一指標前移)。
鍊錶的基本操作
include include include include using namespace std struct listnode void initnode listnode node bool isempty listnode head void pushfront listnode hea...
鍊錶的基本操作
鍊錶操作是最基本的 必須掌握的知識點,最好滾瓜爛熟,透徹理解。工作時間短用的也不夠頻繁,還是總結一下比較好,以加強鞏固。1.單鏈表 結點形式 區分幾個概念 首節點 第乙個元素所在節點。頭指標 指向首節點的指標。頭結點 為了操作方便,在第乙個節點之前附設的乙個結點,此時指向頭結點的為頭指標。基本操作 ...
鍊錶的基本操作。。。
include node.h 列印鍊錶 void print node head printf n 從尾部插入 void insert tail node head,const int d while t next null t next p p next null 從頭部插入 void inser...