如題,經典問題,記錄于此...

遞歸實現

思路:如果只有一個節點,則什么都不做。否則,將當前鏈表(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