如題,經典問題,記錄于此...
遞歸實現
思路:如果只有一個節點,則什么都不做。否則,將當前鏈表(a1,a2...a3)的子鏈表(a2,...an)進行逆轉,返回逆轉后的第一個節點的指針,再將a1節點加到a2節點后面。
代碼:(這里沒有使用頭節點)
node * reverse(node * p){
if(p->next == null){
return p;
}
node * q = p->next;
node * head = reverse(q);
p->next = null;
q->next = p;
return head;
}
非遞歸實現
思路:一個指針進行鏈表的遍歷,一個指針指向逆轉后的鏈表的第一個節點,在遍歷的過程中,將當前節點加入逆轉后的鏈表第一個元素即可。返回逆轉后的鏈表的第一個節點的指針。
代碼:(這里沒有使用頭節點)
node * reverse(node * p){
node * p_reverse;
if(p != null){
p_reverse = p;
node * q = p->next;
p->next = null;
}
while(q != null){
p = q->next;
q->next = p_reverse;
p_reverse = q;
q = p;
}
}
對C語言用的太少,上面的代碼實現可能有點惡心,不過可以實現功能....
文章來源:
http://localhost/wp2/?p=150