如何把乙個單鏈表進行反轉?
方法1:將單鏈表儲存為陣列,然後按照陣列的索引逆序進行反轉。
方法2:使用三個指標遍歷單鏈表,逐個鏈結點進行反轉。
方法3:從第2個節點到第n個節點,依次逐節點插入到第1個節點(head節點)之後,最後將第乙個節點挪到新錶的表尾。
方法1:
浪費空間。
方法2:
使用p和q連個指標配合工作,使得兩個節點間的指向反向,同時用r記錄剩下的鍊錶。
現在進入迴圈體,這是第一次迴圈。
第二次迴圈。
第三次迴圈。。。。。
具體**如下
view plain
actlist* reverselist2(actlist* head)
head=p;
return
head;
}
方法3還是先看圖,
從圖上觀察,方法是:對於一條鍊錶,從第2個節點到第n個節點,依次逐節點插入到第1個節點(head節點)之後,(n-1)次這樣的操作結束之後將第1個節點挪到新錶的表尾即可。
**如下:
view plainactlist* reverselist3(actlist* head)
p->next=head;//相當於成環
head=p->next->next;//新head變為原head的next
p->next->next=null;//斷掉環
return head;
} 附:
完整的鍊錶建立,顯示,反轉**:
view plain//建立:用q指向當前鍊錶的最後乙個節點;用p指向即將插入的新節點。
//反向:用p和q反轉工,r記錄鍊錶中剩下的還未反轉的部分。
#include "stdafx.h"
#include
using namespace std;
struct actlist
; actlist* head;
actlist* create()
else
q=p;
cout
} if(head!=null)
q->next=null;
return head;
}//end of create()
void displaylist(actlist* head)
}//end of display
actlist* reverselist2(actlist* head)
head=p;
return head;
} actlist* reverselist3(actlist* head)
p->next=head;//相當於成環
head=p->next->next;//新head變為原head的next
p->next->next=null;//斷掉環
return head;
} int main(int argc, char* argv)
單鏈表反轉
單鏈表反轉,可以用迴圈做,當然也可以遞迴 詳見 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...
單鏈表反轉
想起很早以前某次面試,面試官很嚴肅的要求我現場手寫單鏈表反轉的 哥虎軀一震,心想 不就需要要個臨時變數來記錄位址嗎,用得著這樣煞有介事?雖然在那之前我的確沒寫過這個程式,哈哈哈 當時我草草寫了十來行 面試官不等我完成,就直接拿過去開始問問題。不知道是不是因為抗壓能力不足,在面試官的不斷 盤問 下,哥...