zoukankan      html  css  js  c++  java
  • 链表的翻转

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

    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;
            
        }

     

     

  • 相关阅读:
    some math words
    图论中匹配问题的三种算法
    如何查看静态库和动态库是32位还是64位
    C/C++语言的版本, Visual Studio版本
    codeblocks
    文件类型
    上海职称评定
    微信登录
    手机归属地查询
    创建AOP静态代理(上篇)
  • 原文地址:https://www.cnblogs.com/wft1990/p/7440217.html
Copyright © 2011-2022 走看看