如题,经典问题,记录于此...

递归实现

思路:如果只有一个节点,则什么都不做。否则,将当前链表(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