一種鏈式訪問的資料結構,單鏈表中的資料是以結點的形式存在,每乙個結點是由資料元素和下乙個結點的儲存的位置組成。單鏈表與陣列相比的最大差別是:單鏈表的資料元素存放在記憶體空間的位址是不連續的,而陣列的資料元素存放的位址在記憶體空間中是連續的,這也是為什麼根據索引無法像陣列那樣直接就能查詢到資料元素
包括鍊錶的增刪查改,以及判別某結點是否存在鍊錶中
(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一直向前...