zoukankan      html  css  js  c++  java
  • 单链表逆序

     递归方法的常用步骤:

      1. 生成子问题。

         子问题须与原始问题为同样的事,且更为简单。即把N的问题简化到N-1;

      2. 构造出口。

         不能无限制地调用本身,须有个出口,化简为非递归状况处理。即当N==某个值时可解。

     

    首先,我们实现从N到N-1

      对于链表A->B->C->D->NULL,我们对后面的B->C->D->NULL  进行逆序: D->C->B->NULL

      然后我们在B后插入A:D->C->B->A->NULL

      代码:

    Node* reversalList(Node* pHead)
    {
        //对后面的节点进行逆序
        Node* nowHead = reversalList(pHead->mpNext);
    
        //在新链表的最后插入原头结点
        Node* pNode = nowHead;
        while (pNode->mpNext)
        {
            pNode = pNode->mpNext;
        }
        pHead->mpNext = pNode->mpNext;
        pNode->mpNext = pHead;
        return nowHead;
    }

    接着,我们实现出口:

      当链表只有两个节点时,直接交换两个节点即实现链表的逆序。

      代码:

    Node* reversalTwo(Node* pHead)
    {
        Node* pNode = pHead;
        pHead = pHead->mpNext;
        pNode->mpNext = pHead->mpNext;
        pHead->mpNext = pNode;
        
        return pHead;
    }
    
    //如果只有两个节点则直接交换
    if(pHead->mpNext->mpNext == NULL)
    {
        return reversalTwo(pHead);
    }

    完整的实现过程:

    #include <iostream>
    
    struct Node
    {
        int mVal;
        Node* mpNext;
    };
    
    void addNode(Node* pHead, int val)
    {
        if(NULL == pHead)
            return;
    
        Node* pNode = new Node;
        pNode->mVal = val;
        pNode->mpNext = pHead->mpNext;
        pHead->mpNext = pNode;
    }
    
    Node* createList()
    {
        Node* pHead = new Node;
        pHead->mVal = 0;
        pHead->mpNext = NULL;
        return pHead;
    }
    
    Node* reversalTwo(Node* pHead)
    {
        Node* pNode = pHead;
        pHead = pHead->mpNext;
        pNode->mpNext = pHead->mpNext;
        pHead->mpNext = pNode;
        
        return pHead;
    }
    
    Node* reversalList(Node* pHead)
    {
        if(pHead->mpNext->mpNext == NULL)
        {
            return reversalTwo(pHead);
        }
    
        Node* nowHead = reversalList(pHead->mpNext);
        Node* pNode = nowHead;
    
        while (pNode->mpNext)
        {
            pNode = pNode->mpNext;
        }
    
        pHead->mpNext = pNode->mpNext;
        pNode->mpNext = pHead;
        return nowHead;
    }
    
    void main()
    {
        Node* pHead = createList();
        addNode(pHead, 1);
        addNode(pHead, 2);
        addNode(pHead, 3);
        Node* nowHead = reversalList(pHead->mpNext);//因为createList返回的头结点并没有保存有用数值,所以首节点用头结点的next;
            return;
    }
  • 相关阅读:
    第三章 操作符
    exit函数
    详解C++ friend关键字
    放假了,暂告一段落,迎接研究生
    使用const 提高函数的健壮性
    使用断言assert
    对return 语句的正确性和效率进行检查
    函数堆栈
    somethings about QSplitter
    引用和引用参数
  • 原文地址:https://www.cnblogs.com/wrbxdj/p/5058953.html
Copyright © 2011-2022 走看看