雙鏈表屬於鍊錶的一種,有兩個指標域,分別指向直接後繼和直接前驅。所有在遍歷雙向鍊錶時,從任意乙個節點開始,都可以很方便的訪問它的前驅節點和後繼節點。使用這種方式解決了單鏈表中不能使用反向遍歷的問題。
在雙鏈表中,每個節點包含三個部分:
struct node
*head=
null
;
基本的運算形式:增加、刪除、更新
插入節點到序列尾部
建立乙個新的節點,通過遍序列表到序列末尾,讓後將節點插入到末尾。
插入過程
建立乙個新節點並賦值,將node的next指標設定為null
檢查集合的頭節點是否為空(head==null)
如果頭節點為空,設定newnode->previous=null,head=newnode;
如果頭節點不為空,定義乙個臨時節點temp=head;
移動temp節點直到到達序列的尾部
設定newnode=temp->next和temp=newnode->previous;
void
insertatend
(int value)
else
printf
("插入末尾成功");
}
插入節點到頭部
建立乙個新的節點,將頭節點替換為新的節點,並更新指標的指向。
插入過程
建立乙個新的節點newnode,並設定newnode->previous=null;
檢查是否head==null;
如果head==null,newnode->next=null,head=newnode;
如果head!=null,newnode->next=head,head=newnode;
void
insertatbeginning
(int value)
else
printf
("插入成功");
}
插入節點到指定元素後
迴圈遍歷鍊錶,建立乙個新的節點,然後將其插入到鍊錶中的指定位置
插入過程
建立乙個新節點並賦值
檢查鍊錶是否為空(head==null)
如果(head==null),newnode->previous=null,newnode->next=null,head=newnode
定義乙個temp=head
通過迴圈遍歷移動temp節點,指定找到我們需要插入的節點位置(for迴圈到position-1)
如果temp->next==null設定flag=0,表面我們要查詢的目標元素未發現,終止迴圈
如果flag=1,設定newnode->next=temp->next,temp->next->previous=newnode,temp->next=newnode和newnode->previous=temp;
void
insertafter
(int value,
int pos)
else}if
(flag)
else
printf
("number of elements is less than position entered");
}}
從鍊錶尾部刪除節點
通過迴圈遍歷到鍊錶尾部,刪除尾部節點
從尾部刪除過程
檢查鍊錶是否為空(head==null)
如果為空,丟擲錯誤並終止程式
如果不為空,定義乙個temp=head;
檢查是否鍊錶只存在乙個節點(temp->previous=null和temp->next=null)
如果只存在乙個節點,設定head=null並刪除temp節點
如果鍊錶存在多個節點,移動temp節點直到到達鍊錶尾部(temp->next!=null)
設定temp->previous->next=null並釋放temp占用記憶體(free(temp))
void
deleteend()
else
printf
("\n刪除成功");
}}
從鍊錶頭部刪除節點
從鍊錶頭部刪除節點
從頭部刪除過程
檢查鍊錶是否為空(head==null)
如果為空,丟擲異常並終止
如果不為空,定義乙個temp節點,且temp=head
檢查鍊錶是否只有乙個節點(temp->previous=temp->next)
如果鍊錶只有乙個節點,設定head=null並釋放free(temp)
否則,設定temp->next=head,head->previous=null並釋放free(temp)
void
deletebeginning()
else
printf
("\n刪除成功");
}}
從鍊錶指定位置刪除節點
遍歷鍊錶到找到指定節點
從指定位置刪除過程
檢查鍊錶是否為空(head==null)
如果為空,丟擲錯誤並終止
如果不為空,定義乙個temp,且temp=head
移動temp節點,直到找到目標節點或者到達鍊錶末尾
如果到達節點末尾,丟擲未發現目標節點異常,並終止
如果到達目標節點,檢查是否只有乙個節點
如果僅有乙個節點,設定head=null並釋放free(temp)
如果鍊錶有多個節點,檢查是否為頭節點(temp==head)
如果為頭節點(temp=head),將頭節點移動到下乙個節點(head==head->next),設定head->previous=null並釋放記憶體free(temp)
如果temp!=head,檢查temp是否為最後乙個節點(temp->next==null)
如果為最後乙個節點,設定temp->previous->next=null並釋放free(temp)
如果temp不是第乙個節點也不是最後乙個節點,設定temp->previous-next=temp->next,temp->next->previous=temp->previous並釋放free(temp)
void
deletespecific
(int delvalue)
else}if
(temp == head)
else
printf
("\ndeletion successful");
}}
瀏覽器的歷史紀錄 大多數主流瀏覽器都支援針對瀏覽歷史記錄的前進、後退,就是基於雙鏈表設計的
大多數演算法
遊戲:卡牌遊戲,記錄牌的順序
單鏈表 雙鏈表
實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的...
單鏈表和雙鏈表
單鏈表 單鏈表只有乙個指向下一結點的指標,也就是只能next 雙鏈表 雙鏈表除了有乙個指向下一結點的指標外,還有乙個指向前一結點的指標,可以通過prev 快速找到前一結點,顧名思義,單鏈表只能單向讀取 為什麼市場上單鏈表的使用多餘雙鏈表呢?從儲存結構來看,每個雙鏈表的節點要比單鏈表的節點多乙個指標,...
單鏈表和雙鏈表
單鏈表 是乙個node,儲存當前物件,並指向下乙個next,插入在第一位node,next指向原來的first 單鏈表 只儲存第乙個node的引用,雙端鍊錶 儲存兩個node的引用,第乙個和最後乙個node,可以從第乙個插入,也可以從最後乙個插入,也可以從頭部和尾部刪除 鏈結點,相當於是車廂 pub...