資料結構 鍊錶 二

2021-08-29 18:18:49 字數 2113 閱讀 4612

上篇部落格詳細介紹了鍊錶的基礎功能增刪改查,但是鍊錶的主要難度是在鍊錶的逆序上,下面主要介紹鍊錶逆序。

1、鍊錶逆序(一)

假設當前有5個結點,head、a1、a2、a3、a4、a5,他們的頭指標是head。我們的思路便是將a1作為當前元素一直往後遍歷,並且將a1後面的資料依次挪到head之後。  

在第一次搬移的過程中,需要將a1的下乙個元素a2放在head之後。如圖所示,當前結點選定為a1,起乙個變數名為current,當前結點的下乙個結點為pnext,則a2便成了pnext = current->next。如果想要將pnext移到head之後,我們按照圖中第1步先將a3連線到a1的後面current->next= pnext->next,然後第2步再將head後面的整體鍊錶放到要移動的a2的後面,也就是pnext->next= head->next,第3步將a2移到head之後head->next=pnext。這三個步驟下來,我們的第一次反轉工作就算完成了。此時的鍊錶鍊錶就變成了head、a2、a1、a3、a4、a5。

按照上圖正確的順序實現第一次反轉以後,可以判定當前的current指標是否已經是尾指標,如果不是就可以繼續執行。第二次反轉後鍊錶就變成了head、a3、a2、a1、a4、a5。因此當把鍊錶內的最後乙個元素也移動到head之後時,鍊錶逆序的工作就算完成了。

**:

//鍊錶逆序

linklist*listrotate(linklist*headnode)

cur =headnode;

ppre->next = headnode;

while (cur->next)

return ppre->next;

}

2、鍊錶逆序(二):迭代的方式

鍊錶的初始狀態如下圖所示

初始狀態,prev是null,head指向當前的頭節點a,next指向a節點的下乙個節點b。首先從a節點開始逆序,將a節點的next指標指向prev,因為prev的當前值是null,所以a節點就從鍊錶中脫離出來了,然後移動head和next指標,使它們分別指向b節點和b的下乙個節點c(因為當前的next已經指向b節點了,因此修改a節點的next指標不會導致鍊錶丟失)。逆向節點a之後,鍊錶的狀態如圖(2)所示:

鍊錶結束方式為head==null

**如圖所示

linklist*listrotate1(linklist*headnode)

return ppre;

}

3、鍊錶的逆序(三):遞迴的方式

還沒弄懂回頭更新;

執行的測試程式

int main()

; int b = 0;

int length = 0;

linklist *rotated;

linklist*headnode = init();//生成頭結點

creat_linklist(headnode,a,5);

insert_list(headnode, 3, 9);

insert_list(headnode, 4, 10);

insert_list(headnode, 4, 11);

show_linklist(headnode);

printf("\n");

delect_link_list(headnode, 5, &b);

show_linklist(headnode);

printf("\n");

length=length_list(headnode);

printf("length is %d", length);

rotated=listrotate2(headnode);

show_linklist(rotated);

system("pause");

}

參考部落格:

資料結構 二 鍊錶

鍊錶,就是鍊錶嘛,下面是鍊錶的基本操作 include include include include pragma warning disable 4996 typedef struct mylist li li createlist int n 建立含有n個資料的鍊錶,返回頭結點 void in...

資料結構(二)鍊錶

本文目錄 1 什麼是鍊錶 2 鍊錶抽象資料型別 3 單向鍊錶 3.1 插入操作 3.1.1 在煉表頭插入 3.1.2 在鍊錶尾插入 3.1.3 在鍊錶中間任意位置插入 3.2 刪除查詢 3.2.1 在煉表頭刪除 3.2.2 在鍊錶尾刪除 3.2.3 在鍊錶中間任意位置刪除 4 雙向鍊錶 4.1 插入...

資料結構試驗二 鍊錶

第二次資料結構試驗 老師給出的程式比較齊全,直接進行稍微修改就可以實現相乘了,僅僅是個雙迴圈而已,其他地方基本沒有難點了,主要是鍊錶的操作,自己做的比較粗糙,不過暫時功能考慮的還算可以.今天早上一點多完善的,但是想提交的時候,電腦沒電自動關機了.然後到現在提交了.根據給出的一元多項式的加法寫出一元多...