反轉鍊錶 單鏈表的逆置

2021-09-29 16:31:43 字數 2666 閱讀 6402

一.題目描述

定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。

鍊錶結點定義如下:

struct listnode

;

二.分析問題1.舉例分析

2.解題思路

解法1

為了正確地反轉乙個鍊錶,需要調整鍊錶中指標的方向。為了將調整指標這個複雜的過程分析清楚,我們可以借助圖形來直觀地分析。如圖所示的鍊錶中,h、i和j是3個相鄰的結點。假設經過若干操作,我們已經把結點h之前的指標調整完畢,這些結點的m_pnext都指向前面乙個結點。接下來我們把i的m_pnext指向h,此時的鍊錶結構如圖所示。

注:

(a)乙個鍊錶。

(b)把i之前所有的結點的m_pnext都指向前乙個結點,導致鍊錶在結點i、j之間斷裂。

不難注意到,由於結點i的m_pnext指向了它的前乙個結點,導致我們無法在鍊錶中遍歷到結點j。為了避免鍊錶在結點i處斷開,我們需要在調整結點i的m_pnext之前,把結點j儲存下來。

也就是說我們在調整結點i的m_pnext指標時,除了需要知道結點i本身之外,還需要i的前乙個結點h,因為我們需要把結點i的m_pnext指向結點h。同時,我們還事先需要儲存i的乙個結點j,以防止鍊錶斷開。因此相應地我們需要定義3個指標,分別指向當前遍歷到的結點、它的前乙個結點及後乙個結點。

最後我們試著找到反轉後鍊錶的頭結點。不難分析出反轉後鍊錶的頭結點是原始鍊錶的尾結點。什麼結點是尾結點?自然是m_pnext為null的結點。

需要注意的問題

解法2

解法2和解法1的唯一差別

三.**

解法1【就地逆置】

listnode* reverselist(listnode* phead)

pnode->m_pnext = pprev;

pprev = pnode;

pnode = pnext;

} return preversehead;

}

void reverselist(listnode* phead)

phead->m_pnext = s;

}

解法2【頭插法】

void reverselist(listnode* phead)

}

解法3【遞迴】

node* reverse(node* list) 

node* last = reverse(list->next);

list->next->next = list;

list->next = nullptr;

return last;

}

示例: 

現有如下一單鏈表,使用遞迴的方法進行逆置。 

當執行到最後乙個

node* last = reverse(list->next);
後,last和list的位置如下圖 

接著執行

此時 return last,返回到上乙個遞迴呼叫點,此時last和list的位置如下 

接著再執行

此時return last,last就是逆置後鍊錶的新頭結點。

單鏈表的逆置 反轉

題目 單鏈表的逆置 反轉。解題思路 思路一 定義三個指標,n1,n2,n3,初始值分別為 鍊錶第乙個節點,鍊錶第二個節點,第三個節點。n2儲存的是n1的位址,n3儲存的是n2的位址,通過n3來往後遍歷,直n2為空,這時n1指向最後乙個元素,這時返回n1,就可以逆置鍊錶 如下圖 實現 slistnod...

逆置 反轉單鏈表(C )詳細

遺留的問題 我想新建立乙個鍊錶來實現單鏈表的反轉,目前還沒有實現出來 思想及演算法 include using namespace std struct list list insert list head,int x list t newlist x p next t return head vo...

單鏈表逆置

單鏈表逆置 include include define item num 10 typedef struct tagnode node node linklist create void linklist destroy node head void linklist print node hea...