資料結構與演算法 線性表 鍊錶

2021-10-02 05:34:22 字數 1767 閱讀 5213

我畫了20張圖,終於讓女朋友學會了翻轉鍊錶-碼海

該文章介紹了鍊錶的基礎知識,

程式區域性性原理(重點關注)

//尾插法

public

class

linkedlist

tmp.next =

newnode

(val)

;//尾部插入

}

public

class

linkedlist

public

static

void

main

(string[

] args)

;// 頭插法構造鍊錶

for(

int i =

0; i < arr.length; i++

)// 列印鍊錶,將列印 4-->3-->2-->1

* 遞迴翻轉結點 node 開始的鍊錶

*/public node invertlinkedlist

(node node)

// 步驟 1: 先翻轉 node 之後的鍊錶

node newhead =

invertlinkedlist

(node.next)

;// 步驟 2: 翻轉該節點,node 的後繼節點設定為空的目的是防止形成環

對於當前node為倒數第二個節點時,將下乙個節點(即最後乙個節點)的後繼改為當前節點,但此時有環,所以還要將當前節點的後繼

node.next.next = node;

node.next = null;

// 步驟 3: 返回翻轉後的頭結點,在遞迴結束時返回的是第二個節點

return newhead;

}public

static

void

main

(string[

] args)

;for

(int i =

0; i < arr.length; i++

) node newhead = linkedlist.

invertlinkedlist

(linkedlist.head.next)

;// 翻轉後別忘了設定頭結點的後繼結點!

linkedlist.head.next = newhead;

linkedlist.

printlist()

;// 列印 1,2,3,4

}複雜度:由於遞迴呼叫了 n 次 invertlinkedlist 函式,所以時間複雜度顯然是 o(n)複雜度:用迭代的思路來做由於迴圈了 n 次,顯然時間複雜度為 o(n),另外由於沒有額外的空間使用,也未像遞迴那樣呼叫遞迴函式不斷壓棧,所以空間複雜度是 o(1),對比遞迴,顯然應該使用迭代的方式來處理

/**

* 迭代翻轉

*/public

void

iterationinvertlinkedlist()

// 此時 pre 為頭結點的後繼結點

head.next = pre;

}

資料結構與演算法 線性表 鍊錶

書接上文 前篇提到的順序表是線性表的一種表示形式,但是在頻繁的增刪操作中 順序表是不夠打的 這就要引出今天的鍊錶了 三 迴圈鍊錶的基本演算法 四 雙向鍊錶的基本演算法總結 除頭結點和尾結點外,每個結點有且只有乙個直接前驅和直接後繼 最後乙個結點的指標為null 邏輯關係 資料元素之間的邏輯關係是由結...

資料結構與演算法 線性表

概念 一種資料結構,每個結點最多只有乙個前驅結點和乙個後繼結點 類別 順序表 定長 鍊錶 變長 棧 棧頂刪除 彈棧 棧頂插入 壓棧 後進先出 lifo 佇列 隊頭刪除 出隊 隊尾插入 入隊 先進先出 fifo 線性表的抽象資料型別定義 c 1.template2.class list 棧的抽象資料型...

資料結構與演算法 線性表

n維向量 x1,x2,xn 是乙個長度為n的線性表 英文小寫字母表 a,b,c,z 是乙個長度為26的線性表 一年中的四個季節 春,夏,秋,冬 是乙個長度為4的線性表 矩陣是乙個比較複雜的線性表 學生情況登記表是乙個複雜的線性表 由若干資料項組成的資料元素稱為記錄 由多個記錄構成的線性表又稱為檔案 ...