链表的翻转

输入一个链表,反转链表后,输出链表的所有元素。

struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};


方法一:建立节点指针类型堆栈,遍历链表,将指针压栈,顺次出栈,实现反转。这个占用内存空间较大。

ListNode* ReverseList(ListNode* pHead) {
        //把链表中的元素的值首先存入一个栈中
        //从栈中一个一个的读出数据插入list中
        if(pHead==NULL)
            return NULL;
        stack<int> st;
        ListNode *list=pHead;
        //入栈
        while(list!=NULL)
        {
            st.push(list->val);
            list=list->next;
        }
        //创建链表list
        list=pHead;
        if(list!=NULL)
        {
            while(!st.empty())
           {
              list->val=st.top();
              st.pop();
              list=list->next;            
            }
        }
        else//末尾结点的next指针指向NULL
          list->next=NULL;
        return pHead;

    }

思路2:依次遍历链表,改变节点的指向,注意之前要将下一个节点的地址赋值给一个指针next保存。

事实上,next指针表示去掉已经反转的链表的第二个节点,pre指针表示反转过的链表表头,pHead指针表示去掉已经反转的链表的表头。

 

ListNode* ReverseList(ListNode* pHead) {
        if(pHead==NULL)
            return NULL;
        ListNode* pre=NULL;//前一个节点
        ListNode* pNext=NULL;//下一个节点(为了保存)
        while(pHead!=NULL)
        {
            pNext=pHead->next;//下一个节点的引用
            pHead->next=pre;//当前节点对下一个节点的引用指向前一个节点
            pre=pHead;//前一个节点指向当前节点
            pHead=pNext;//将当前节点指向下一个节点            
        }
        return pre;
        
    }

 

 

 

posted @ 2017-08-27 13:57  泡面小王子  阅读(188)  评论(0编辑  收藏  举报