【數據結構】鏈表的逆置(圖文)


前言

輸入的是一條帶有頭結點的鏈表L 故頭結點為L,第一個節點為L->next.

先上代碼

void Reverse(LinkList *L)
{
    LinkList  *p,*q;
    p = L->next;
    L->next = NULL;
    while(p!=NULL)
    {
        q = p;
        p = p->next;
        q->next = L->next;
        L->next = q;
    }

}

講解(摘自:鏈表逆置詳細講解(圖文)

我們先看第一輪循環做了什么:

建議閱讀順序:黑色(初始)、藍色(操作)、紅色(理解)
image

第二輪:

建議閱讀順序:黑色(初始)、藍色(操作)、紅色(理解)
image

第三輪:

就是頭插法

就是頭插發

就是頭插發

最后給一份帶注釋的代碼~

void listReverse(linkedList &L)
{
	node *p,*s;
	//1.准備工作
	p = L->next;
	L->next = NULL;
	
	while(p)
	{
		//2.1 s記錄正在處理的結點,p記錄下一輪待處理的結點
		s = p; 			//s承接上一輪記錄的位置
		p = p->next; 	//p為下一輪記錄位置
		//2.2 把s插入 已逆置的部分 中
		s->next = L->next;  // L->next代表已逆置的第一結點,s的指針域指向它
		L->next = s;	//(頭結點的指針域,即)第一結點 設置為s
		//2.2步驟相當於:
		//s 對 隊伍(已逆置部分)的隊首(已逆置的第一結點)說:你不要排在櫃台前了,你排在我后面
		//等隊伍排在s后面后,s自己排到了櫃台前
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM