一.題目描述
定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。
鍊錶結點定義如下:
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...