单向链表的反转

来源:互联网 发布:日本缺java 编辑:程序博客网 时间:2024/06/08 07:03

 

struct node{int a;node *next;};void reverse1(node *head){node *p = head, *r = head, *q;while (p){q = p->next;p->next = head;head = p;p = q;}r->next = NULL;}void reverse2(node *head){node *p = head, *r = NULL, *q = NULL;while(p){r = q;q = p;p = p->next;q->next = r;}head = q;}


 

方法三(递归):

    node* reverse( node* pNode, node*& head)
    
{
        
if ( (pNode == 0|| (pNode->next == 0) ) // 递归跳出条件
        {
            head 
= pNode; // 将链表切断,否则会形成回环
            return pNode;
        }


        node
* temp = reserve(pNode->next, head);// 递归
        temp->next = pNode;// 将下一节点置为当前节点,既前置节点
        return pNode;// 返回当前节点
    }

这个方法是采用了递归算法,也就是在反转当前节点之前先反转其后继节点,说白了其实就是利用函数的调用堆栈构建了一个临时链表罢了,挺废的一个算法,权当作是写着好玩,没有什么实在的意义。
采用此算法需要注意的是,头结点必须要传入的是引用,因为在递归跳出的时候要切断链表,否则链表将会形成一个回环。

原创粉丝点击