大部分**
迭代的方式是從鏈頭開始處理,如下圖給定乙個存放5個數的鍊錶。
listnode* listreverse1(listnode *h)
return newh;
}
我們再來看看遞迴實現鍊錶翻轉的實現,前面非遞迴方式是從前面數1開始往後依次處理,而遞迴方式則恰恰相反,它先迴圈找到最後面指向的數5,然後從5開始處理依次翻轉整個鍊錶。
首先指標h迭代到底如下圖所示,並且設定乙個新的指標作為翻轉後的鍊錶的頭。由於整個鍊錶翻轉之後的頭就是最後乙個數,所以整個過程newh指標一直指向存放5的位址空間。
listnode* listreverse2(listnode *h)
#include#includeusing namespace std;
struct listnode
};//非遞迴方式。常規思路,簡潔,清晰
//思路就是:從原鍊錶的頭部乙個乙個取節點並插入到新鍊錶的頭部
listnode* reverselist1(listnode *h)
return newh;
}//遞迴方式
listnode* reverselist2(listnode *h)
//非遞迴。思路:每次都將原第乙個結點之後的那個結點放在新的表頭後面。
//比如1, 2, 3, 4, 5
//第一次:把第乙個結點1後邊的結點2放到新表頭後面,變成2, 1, 3, 4, 5
//第二次:把第乙個結點1後邊的結點3放到新表頭後面,變成3, 2, 1, 4, 5
//……
//直到: 第乙個結點1,後邊沒有結點為止。
listnode* reverselist3(listnode *h)
return res->next;
}void printnode(listnode *head)
}int main()
; listnode *head = new listnode(a[0]);
listnode *p = head;
for (int i = 1; i < a.size(); i++)
listnode *p1 = head;
cout << "before reverse: " << endl;
printnode(p1);
cout << endl;
cout << "after reverse using non-recursion method: " << endl;
listnode *res1 = reverselist1(p1);
printnode(res1);
cout << endl;
listnode *p2 = res1;
cout << "before reverse: " << endl;
printnode(p2);
cout << endl;
cout << "after reverse using recursion method: " << endl;
listnode *res2 = reverselist2(p2);
printnode(res2);
cout << endl;
listnode *p3 = res2;
cout << "before reverse: " << endl;
printnode(p3);
cout << endl;
cout << "after reverse using another non-recursion method: " << endl;
listnode *res3 = reverselist3(p3);
printnode(res3);
system("pause");
}
單鏈表反轉
單鏈表反轉,可以用迴圈做,當然也可以遞迴 詳見 include includestruct node 3 1 4 6 2 1 1 3 4 6 2 2 4 1 3 6 2 3 6 4 1 3 2 4 2 6 4 1 3 5 迴圈反轉,即依次改動3個指標值,直到鍊錶反轉完成 比如,上面第 1 行到第 2...
反轉單鏈表
include stdafx.h include include using namespace std struct listnode typedef listnode plistnode typedef plistnode list list creatlist return head void...
單鏈表反轉
想起很早以前某次面試,面試官很嚴肅的要求我現場手寫單鏈表反轉的 哥虎軀一震,心想 不就需要要個臨時變數來記錄位址嗎,用得著這樣煞有介事?雖然在那之前我的確沒寫過這個程式,哈哈哈 當時我草草寫了十來行 面試官不等我完成,就直接拿過去開始問問題。不知道是不是因為抗壓能力不足,在面試官的不斷 盤問 下,哥...