如题,经典问题,记录于此...
递归实现
思路:如果只有一个节点,则什么都不做。否则,将当前链表(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