資料結構與演算法 003 單鏈表

2021-10-20 19:45:49 字數 4371 閱讀 1496

單鏈表的介紹:

鍊錶是有序的列表,它在記憶體中的儲存如下圖:

鍊錶是以節點的方式進行鏈式儲存的資料結構。

每個節點包含data域,用來儲存資料;next域,用來指向下乙個節點。

如圖所示,鍊錶各個節點不一定是連續儲存的,因此比陣列的儲存更加靈活。

鍊錶分為有頭的節點和無頭的節點。

名稱型別

含義num

int表示單鏈表的編號

value

string

表示單鏈表的值

next

linkedlist

(指標)指向下乙個節點

class

linkedlist

//為了顯示方法,我們重寫 tostring 方法

@override

public string tostring()

';}}

方法名稱

返回值方法功能

getlinkedlistlengt()

int獲取單鏈表長度

add()

void

新增方法(在鍊錶末尾新增)

delbynum()

void

按照鍊錶序號進行刪除

addbynum

void

新增方法(按照序號進行新增)

update()

void

更新單鏈表節點內容

showlinkedlist()

void

正序顯示(遍歷)單鏈表

public

class

linkedlistfun

//獲取單鏈表長度

public

intgetlinkedlistlength()

while

(true)if

(temp.next == null && length !=0)

temp = temp.next;

}return length;

}//新增方法(在鍊錶末尾)

public

void

add(linkedlist linkedlist)

if(temp.next == linkedlist)

temp = temp.next;

} temp.next = linkedlist;

}//按照鍊錶序號進行刪除

public

void

delbynum

(int delnum)

linkedlist temp = head;

boolean flag =

false

;while

(true)if

(temp.next.num == delnum)

temp = temp.next;}if

(flag)

else

}//新增方法(按照序號進行新增)

public

void

addbynum

(linkedlist linkedlist)

if(temp.next.num > linkedlist.num)

else

if(temp.next.num == linkedlist.num)

temp = temp.next;}if

(flag)

else

}//更新單鏈表節點內容

public

void

update

(linkedlist linkedlist)

linkedlist temp = head.next;

boolean flag =

false

;//表示是否找到該節點

while

(true)if

(temp.num == linkedlist.num)

temp = temp.next;

}//根據 flag 判斷是否找到要修改的節點

if(flag)

else

}//正序顯示(遍歷)單鏈表

public

void

showlinkedlist()

system.out.

println

(temp)

; temp = temp.next;}}

}

public

class

linkedlisttest

}

//練習1:獲取到單鏈表的節點的個數(如果是帶頭的節點鍊錶,需求不統計頭節點)

public

static

intgetlength

(linkedlist head)

while

(temp != null)

return length;

}

思路:

編寫乙個方法,接收 head 節點,同時接收乙個 index

index 表示是倒數第 index 個節點

先把鍊錶從頭到尾遍歷,得到鍊錶的總長度 getlength

得到 size 後,我們從鍊錶的第乙個開始遍歷(size - index)個,就可以得到

.如果找到了,則返回該節點,否則返回null

//練習2:查詢單鏈表中的倒數第 k 個節點

public

static linkedlist findlastindexnode

(linkedlist head,

int index)

//第乙個遍歷得到鍊錶的長度(節點個數)

int length =

getlength

(head)

;//練習1方法

//第二次遍歷 size - index 位置,就是我們倒數的第 k 個節點

//先做乙個 index 的校驗

if(index <=

0|| index > length)

//定義給輔助變數,for 迴圈定位到倒數的 index

linkedlist temp = head.next;

for(

int i =

0; i < length - index; i++

)return temp;

}

//練習3 將單鏈表反轉

public

static

void

reversetlist

(linkedlist head)

//定義乙個輔助的變數,幫助我們遍歷原來的鍊錶

linkedlist temp = head.next;

linkedlist next = null;

//指向當前節點 [temp] 的下乙個節點

linkedlist revershead =

newlinkedlist(0

,"");

//遍歷原來的鍊錶,每遍歷乙個節點,就將其取出,並放在新鍊錶 revershead 的最前面

while

(temp != null)

//將 head.next 指向 revershead.next

head.next = revershead.next;

}

思路:

方式二:可以利用棧這個資料結構,將各個節點壓入到棧中,然後利用棧先進後出的特點,實現逆序列印。

//練習4 從尾到頭列印單鏈表

//方式二

public

static

void

reverserprint

(linkedlist head)

//建立乙個棧,將各個節點壓入棧

stack

stack =

newstack

<

>()

; linkedlist temp = head.next;

//將所有節點壓入棧中

while

(temp != null)

//將棧中的節點進項列印,pop出棧

while

(stack.

size()

>0)

}

在這裡插入**片

單鏈表(演算法與資料結構)

鍊錶 單鏈表 為每個結點新增1個指標域,每個結點包括兩個域 資料域 存放元素本身資訊 指標域 存放後繼結點的儲存位置 指向鍊錶中第乙個結點的指標,稱為這個鍊錶的頭指標。最後乙個元素的指標不指向任何結點,稱為空指標,圖示中用 表示,在演算法中用 null 表示 帶頭結點的單鏈表 頭結點 可以不存資訊,...

資料結構與演算法 單鏈表

鍊錶是有序的列表,但是它在記憶體中是儲存如下 鍊錶是以節點的方式來儲存的 鍊錶的各個節點不一定是連續儲存的 鍊錶分帶頭結點的鍊錶和不帶頭結點的鍊錶 新增先建立乙個 head 頭結點,作用就是表示單鏈表的頭 後面我們每新增乙個結點,就直接加入到鍊錶的最後 遍歷 通過乙個輔助變數,幫助來遍歷整個鍊錶 第...

資料結構與演算法 單鏈表

單鏈表的建立 1.建立乙個head頭節點,作用就是表示單鏈表的頭 2.後面我們每新增乙個節點,就直接加入鍊錶的最後 定義heronode,每個heronode物件就是乙個節點 class heronode 為了顯示方法,重新tostring public string tostring 定義sing...