資料結構與演算法02 鍊錶的使用與實現

2021-10-21 05:57:38 字數 3578 閱讀 4187

二、常用鍊錶

三、⾃定義單向鍊錶

四、 來一道力扣題嗎?

五、 總結

動態陣列有明顯的缺點:可能會造成記憶體的浪費

是否可以⽤多少申請多少記憶體:鍊錶可以

鍊錶是⼀種鏈式儲存的線性表,所有元素的記憶體位址不⼀定是連續的

鍊錶中的每⼀個記憶體塊被稱為節點node,node節點由兩部分構成:

 儲存資料(可以是任何型別)

 還需記錄鏈上下⼀個節點的位址,即後繼指標next,⽤來儲存下⼀個節點的node對

象陣列的插入、刪除操作時,為了保持記憶體資料的連續性,需要做大量的資料搬移,

所以時間複雜度是 o(n)。

在鍊錶中插入和刪除乙個資料是非常快速的,我們只需要考慮相鄰結點的指標改

變,所以對應的時間複雜度是 o(1)。

1)每個節點只包含乙個指標,即後繼指標。

2)單鏈表有兩個特殊的節點,即首節點和尾節點。用首節點位址表示整條鍊錶,尾節點的後

繼指標指向空位址null。

3)效能特點:插入和刪除節點的時間複雜度為o(1),查詢的時間複雜度為o(n)。

1)除了尾節點的後繼指標指向首節點的位址外均與單鏈表一致。

2)適用於儲存有迴圈特點的資料,比如約瑟夫問題。

1)節點除了儲存資料外,還有兩個指標分別指向前乙個節點位址(前驅指標prev)和下乙個

節點位址(後繼指標next)。

2)首節點的前驅指標prev和尾節點的後繼指標均指向空位址。

3)效能特點:

以刪除操作為例,刪除操作分為2種情況:給定資料值刪除對應節點和給定節點位址刪除節點。

◇第一種情況:單鏈表和雙向鍊錶都需要從頭到尾進行遍歷從而找到對應節點進行刪除,時間複雜度為o(n)。

◇第二種情況:要進行刪除操作必須找到前驅節點,單鏈表需要從頭到尾進行遍歷直到p->next = q,時間複雜度為o(n),而雙向鍊錶可以直接找到前驅節點,時間複雜度為o(1)。

◇對於乙個有序鍊錶,雙向鍊錶的按值查詢效率要比單鏈表高一些。因為我們可以記錄上次查詢的位置p,每一次查詢時,根據要查詢的值與p的大小關係,決定是往前還是往後查詢,所以平均只需要查詢一半的資料。

1)在雙向迴圈鍊錶中,可見的不只有頭指標head,還有尾節點end。這是和單鏈表的

區別。2) 雙向迴圈鍊錶的頭指標head的前乙個節點指向end,尾節點end的後乙個節點指向

head。

int

size()

;// 元素的數量

boolean

isempty()

;// 是否為空

intindexof

(e element)

;// 檢視元素的位置

boolean

contains

(e element)

;// 是否包含某個元素

e get

(int index)

;// 返回index位置對應的元素

e set

(int index, e element)

;// 設定index位置的元素

void

clear()

;// 清除所有元素

void

add(e element)

;// 新增元素到最後面

void

add(

int index, e element)

;// 往index位置新增元素

e remove

(int index)

;// 刪除index位置對應的元素

package day02;

public

inte***ce

list

package day02;

public

abstract

class

abstractlist

implements

list

@override

public

boolean

contains

(e element)

@override

public

boolean

isempty()

@override

public

void

add(e element)

protected

void

checkaddindex

(int index)

}protected

void

checkindex

(int index)

}}

package com.kkb.day02;

public

class

mylinkedlist

extends

abstractlist

}@override

public e get

(int index)

private node

node

(int index)

return node;

}@override

public e set

(int index, e element)

@override

public

void

clear()

@override

public

intindexof

(e element)

node=node.next;}}

else

node=node.next;}}

//沒有找到元素返回-1

return element_not_found;

}@override

public

void

add(

int index, e element)

else

size++;}

@override

public string tostring()

sb.(node.element)

; node=node.next;

} sb.

("]");

//拼接末尾

return sb.

tostring()

;//返回輸出結果

}@override

public e remove

(int index)

else

size--

;return oldnode.element;

}}

請編寫乙個函式,使其可以刪除某個鍊錶中給定的(非末尾)節點。傳入函式的唯一引數為 要被刪除的節點 。

資料結構與演算法分析筆記02 鍊錶

1.抽象資料型別 abstract data type,adt 是一些操作的集合。2.鍊錶由一系列不必在記憶體中相連的結構組成。每乙個結構均含有表元素和指向包含該元素後繼元結構的指標。我們稱之為next指標。最後乙個單元的next指標指向null 該值由c定義並且不能與其他指標混淆。ansi c規定...

資料結構與演算法 鍊錶

題目 合併兩個已經排序好的鍊錶 非遞迴和遞迴兩種 方法1 cpp view plain copy print color 000000 合併鍊錶.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std struct listnod...

資料結構與演算法 鍊錶

在講述鍊錶之前讓我們對資料結構進行乙個簡單的回顧 我們知道,資料結構指的是描述實際問題中各個資料項節點之間的前後邏輯結構關係,即要麼是線性結構 即某一資料項的前繼節點和後繼節點有且只有乙個 要麼是非線性結構 即某一資料節點的前驅或者後繼節點不止乙個 在確定了實際資料項的資料結構之後,我們要採用某種儲...