• 剑指offer:反转链表


    题目描述:

    输入一个链表,反转链表后,输出新链表的表头。

    解题思路:

    思路一:先遍历一次链表,将每个结点存入栈中,再清空栈,构造新的链表,当前结点的下一个结点都为从栈新取出的结点,同时结点后移,指向这个新取出的结点。例如,用tmp表示新链表,cur = s.top(); cur->next = nullptr; tmp->next = cur. 注意需要判断当前栈中结点数量,若取完栈顶元素后无栈为空,则不再更新tmp = tmp->next。

    思路二:看了一下网上有更简单清晰的思路,用三个指针来维护整个链表,cur指向当前结点,pre指向前一个结点,nex指向后一个结点。

    代码:

    思路一:

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
        ListNode* ReverseList(ListNode* pHead) {
            if(pHead==nullptr)
                return pHead;
            ListNode *new_pHead, *tmp, *cur;
            tmp = pHead;
            stack<ListNode*> s;
            while(tmp!=nullptr)
            {
                s.push(tmp);
                tmp = tmp->next;
            }
            tmp = s.top();
            s.pop();
            new_pHead = tmp;
            while(!s.empty())
            {
                cur = s.top();
                cur->next = nullptr;
                s.pop();
                tmp->next = cur;
                if(s.size()>0)
                    tmp = tmp->next;
            }
            return new_pHead;        
        }
    };

    思路二:

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
        ListNode* ReverseList(ListNode* pHead) {
            if(pHead==nullptr)
                return pHead;
            ListNode *cur, *pre, *nex, *new_pHead;
            pre = nullptr;
            cur = pHead;
            while(cur!=nullptr)
            {
                nex = cur->next;
                if(nex == nullptr)
                    new_pHead = cur;
                
                cur->next = pre;
                pre = cur;
                cur = nex;
            }
            return new_pHead;
        }
    };
  • 相关阅读:
    POJ 3970(最小公倍数LCM)
    06005_Jedis入门
    雷林鹏分享:C# 字符串(String)
    雷林鹏分享:C# 类(Class)
    雷林鹏分享:C# 枚举(Enum)
    雷林鹏分享:C# 运算符重载
    雷林鹏分享:C# 多态性
    雷林鹏分享:C# 命名空间(Namespace)
    雷林鹏分享:C# 接口(Interface)
    雷林鹏分享:C# 正则表达式
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10590609.html
Copyright © 2020-2023  润新知