總結 2 鍊錶

2022-04-19 05:48:15 字數 2783 閱讀 6918

一種鏈式訪問的資料結構,單鏈表中的資料是以結點的形式存在,每乙個結點是由資料元素和下乙個結點的儲存的位置組成。單鏈表與陣列相比的最大差別是:單鏈表的資料元素存放在記憶體空間的位址是不連續的,而陣列的資料元素存放的位址在記憶體空間中是連續的,這也是為什麼根據索引無法像陣列那樣直接就能查詢到資料元素

包括鍊錶的增刪查改,以及判別某結點是否存在鍊錶中

(1)鍊錶類結構

public class linked 

public node(t t)

} private node head; //頭結點

private int size; //鍊錶元素個數

//建構函式

public linked()

}

(2)插入

頭部插入:node.next = this.head 新節點的下個元素指向當前頭節點

中間插入:node.next = prenode.next; prenode.next = node; 要插入的節點的下乙個節點指向prenode節點的下乙個節點 & prenode的下乙個節點指向要插入節點node

//鍊錶頭部新增元素

public void addfirst(t t)

//向鍊錶尾部插入元素

public void addlast(t t)

//向鍊錶中間插入元素

public void add(t t,int index)

if (index == 0)

node prenode = this.head;

//找到要插入節點的前乙個節點

for(int i = 0; i < index-1; i++)

node node = new node(t);

//要插入的節點的下乙個節點指向prenode節點的下乙個節點

node.next = prenode.next;

//prenode的下乙個節點指向要插入節點node

prenode.next = node;

this.size++;

}

(2)刪除

當cur.next 為要刪除的節點時,cur.next = curr.next.next

//刪除鍊錶元素

public void remove(t t)

//要刪除的元素與頭結點的元素相同

while(head != null && head.t.equals(t))

/*** 上面已經對頭節點判別是否要進行刪除

* 所以要對頭結點的下乙個結點進行判別

*/node cur = this.head;

while(cur.next != null)

else cur = cur.next;

} }

快慢指標,從頭遍歷

public linklist knum(linklist list, int k) 

low = low.next;

height = height.next;

}if (num < k)

return null;

else

return low;

}

(1)遍曆法:在鍊錶遍歷的過程中將指標順序置換

public static node reversenode(node node)

return pre;

}

(2)遞迴法:從最後乙個node開始,在彈棧的過程中將指標順序置換的

public static node reverse(node node)
單鏈表查詢方向只能是乙個方向,並且刪除乙個節點依賴於它的前乙個節點

(1)插入

需要處理4個指向

node.pre = pre;

node.next = pre.next;

pre.next.pre = node;

pre.next = node;

(2)刪除

cur.pre.next = cur.next;

if(cur.next!=null)

首先建立兩個指標p1和p2,讓它們同時指向這個鍊錶的頭節點。然後遍歷鍊錶,p1每次移動乙個節點,p2每次移動兩個節點,然後比較指向的節點是否相同,相同則說明有環

public static boolean iscycle(node head) 

}return false;

}

即使資料是已經排好序的,想要查詢其中的乙個資料,只能從頭開始遍歷鍊錶,這樣效率很低,時間複雜度很高,是 o(n)。

那我們有沒有什麼辦法來提高查詢的效率呢?我們可以為鍊錶建立乙個「索引」,這樣查詢起來就會更快,如下圖所示,我們在原始鍊錶的基礎上,每兩個結點提取乙個結點建立索引,我們把抽取出來的結點叫做索引層或者索引,down 表示指向原始鍊錶結點的指標。

我們給索引層再加一層索引,能繼續提高有序鍊錶的查尋速度

public class skiplist 

}if (p.forwards[0] != null && p.forwards[0].data == value) else

}}

鍊錶總結(2)

1.刪除給定值的所有結點 public void removeallkey int key node prev this head node cur this head.next 先考慮頭結點以後的結點 while cur null else if head.data key 2.鍊錶反轉 publ...

鍊錶 鍊錶環問題總結

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...

迴圈鍊錶(2)

迴圈鍊錶中,如果我們要找最後乙個元素,時間複雜度為o n 因為我們需要從第乙個開始乙個接乙個的找。那怎樣再次簡化,將時間複雜度降低呢 我們可以設定乙個尾指標 作用類似於頭指標 指向尾結點,尾結點的指標指向第乙個結點,第乙個結點的指標指向第二個結點 判斷單鏈表是否有環的兩種方法 指標p和q,p一直向前...