數據結構中有鏈表、棧、隊列、排序、數組、樹。下面學習單鏈表。
單鏈表概念
鏈表是最基本的數據結構,以head爲頭節點,頭結點並不存放任何數據,它是鏈表的開始,指向鏈表中第一個節點,而每個節點都有一個next的向下引用,指向下一個節點,直到最後一個節點。每一個節點由兩部分組成,包括data(存放數據),next(指向下一個節點),下面是單鏈表的基本形式。
單鏈表用java定義如一下代碼。
class Node{
int data;//數據
Node next=null;//節點的引用,指向下一個節點
public Node(int data){
this.data=data;
}
}
對於鏈表的增加或者刪除一個節點相對於順序表來說則是比較高效的,鏈表只需要改變節點之間的引用關係,而順序表還需要移動元素,如果不理想的話,甚至要移動所有數據,這也就造成了順序表和鏈表之間對於增刪效率的差異,下面用java實現以下單鏈表增加節點和刪除節點的情況。
單鏈表增加節點
上圖也就簡單的說明了在中間插入一個節點,只需要改變節點之間的引用關係即可。下面貼出用java實現的增加節點的代碼。
//向鏈表末尾添加節點
public void addNode(int data){
Node node=new Node(data);
if(head==null){
head=node;
return;
}
Node temp=head;
while(temp.next!=null){
temp=temp.next;
}
temp.next=node;
}
//向固定位置添加節點
public void addNode(int index,int data){
Node node=new Node(data);
if(index<1||index>length()-1)
return;
Node temp=head;
int i=0;
while(temp.next!=null){
//遍歷到目標節點時,前一個節點爲temp 當前節點爲temp.next 後一個節點爲temp.next.next
if(index==i++){
node.next=temp.next.next;//將目標節點的引用指向,後一個節點
temp.next=node;//將前一個節點的應用指向node
}
temp=temp.next;
}
- }
單鏈表刪除節點
//刪除節點
public void deleteNode(int index){
if(index<1||index>length()-1){
return;
}
if(head==null)
return;
Node temp=head;
int length=1;
while(temp.next!=null){
//當前節點爲temp.next 前一個節點爲temp 後一個節點爲temp.next.next
if(index==length++){
temp.next=temp.next.next;
return;
}
temp=temp.next;
}
}
以上也只是自己對單鏈表的增加和刪除鏈表節點簡單總結。
雙鏈表的概念
雙鏈表是每個節點有兩個地址的線性錶鏈表,兩個地址分別指向前驅節點和後繼節點。下面貼出雙鏈表的部分結構。
用java實現雙鏈表的代碼如下。
class DoubleNode{
int data;//存放數據
DoubleNode pre,next;//節點的前驅,後繼節點
public DoubleNode(int data, DoubleNode pre, DoubleNode next) {
super();
this.data = data;
this.pre = pre;
this.next = next;
}
}
雙鏈表增加節點
public void addNode(int n,int data){
DoubleNode temp=head;
int length=0;
while(temp.next!=null){
//當前節點爲temp.next 前驅節點爲temp 後繼節點temp.next.next
if(n==length++){
DoubleNode node=new DoubleNode(1,temp,temp.next);
temp.next=node;//前驅節點的後繼節點爲node,
temp.next.pre=node;//插入節點的後繼節點的前驅爲node
}
temp=temp.next;
}
}
雙鏈表刪除節點
public void deleteNode(int n){
DoubleNode temp=head;
int length=0;
while(temp.next!=null){
//當前節點爲temp.next 前驅節點爲temp 後繼節點temp.next.next
if(n==length++){
temp.next=temp.next.next;
temp.next.next.pre=temp;
}
temp=temp.next;
}
}
通過以上分析,我們知道雙鏈表在單鏈表的結構上增加了前驅節點,這使得雙鏈表可以在兩個方向遍歷,訪問前驅節點和後繼節點。