上篇部落格詳細介紹了鍊錶的基礎功能增刪改查,但是鍊錶的主要難度是在鍊錶的逆序上,下面主要介紹鍊錶逆序。
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 插入...
資料結構試驗二 鍊錶
第二次資料結構試驗 老師給出的程式比較齊全,直接進行稍微修改就可以實現相乘了,僅僅是個雙迴圈而已,其他地方基本沒有難點了,主要是鍊錶的操作,自己做的比較粗糙,不過暫時功能考慮的還算可以.今天早上一點多完善的,但是想提交的時候,電腦沒電自動關機了.然後到現在提交了.根據給出的一元多項式的加法寫出一元多...