zoukankan      html  css  js  c++  java
  • Leetcode---剑指Offer题6---单链表反转




    剑指Offer-面试题6---从尾到头打印链表

    1、介绍

    https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/
    输入一个链表的头结点,按照链表从尾到头的顺序返回一个vector数组。

    2、题解

    C#
    时间O(n),无额外空间开销

            public int[] ReversePrint(ListNode head)
            {
                int len = 0;
    
                ListNode temp = head;
                while (temp != null)
                {
                    len++;
                    temp = temp.next;
                }
    
                ListNode temp2 = head;
                int[] numArr = new int[len];
                for (int i = len-1; i >=0; i--)
                {
                    numArr[i] = temp2.val;
                    temp2 = temp2.next;
                }
    
                return numArr;
            }
    

    c++

    std::vector<int> printListFromTailToHead(ListNode* head)
    {
        std::vector<int> vals;
        if(head != nullptr)
        {
            ListNode* temp = head;
            while(temp != nullptr){
    			//直接把值添加到数组开头,相当于翻转了
                vals.insert(vals.begin(),temp->val);
                temp = temp->next;
            }
        }
        return vals;
    }
    
    

    3、变形题

    输入链表头结点,把链表翻转后返回。

    本人写法:利用了vector,所以增加了空间开销

    ListNode* printListFromTailToHead(ListNode* head)
    {
        if(head != nullptr){
    		//先翻转链表
            std::vector<ListNode*> nodes;
    
            ListNode* temp = head;
            while(temp != nullptr){
                nodes.insert(nodes.begin(),temp);
                temp = temp->next;
            }
    
    		//再翻转next指向
            for(int i=0;i<nodes.size()-1;i++){
                nodes[i]->next = nodes[i+1];
            }
            nodes[nodes.size()-1]->next = nullptr;
            return nodes[0];
        }
        return head;
    }
    
    

    更好点的写法:定义三个指针分别指向当前结点、前一个结点、后一个结点。然后翻转每一个指向,最后返回第一个结点(刚开始的头结点)。

    ListNode* printListFromTailToHead(ListNode* head)
    {
        //当前节点、前一个结点、后一个结点、翻转后的头结点
        ListNode* currentNode = head;
        ListNode* frontNode = nullptr;
        ListNode* nextNode = nullptr;
        ListNode* newHead = nullptr;
    
        while(currentNode != nullptr){
            //如果是最后一个结点,赋值后退出
            if(currentNode->next == nullptr){
                currentNode->next = frontNode;
                newHead = currentNode;
                break;
            }
            nextNode = currentNode->next;
            //翻转
            currentNode->next = frontNode;
            frontNode = currentNode;
            currentNode = nextNode;
            nextNode = currentNode->next;
        }
        return newHead;
    }
    
    
  • 相关阅读:
    Linux日志文件/var/log详解
    QT 的信号与槽机制介绍
    利用线程通信,写2个线程,一个线程打印1~52,另一个线程打印A~Z,打印顺序应该使12A34B56C···5152Z
    mysql快速安装
    zabbix安装源
    mysql手动安装
    没有可用软件包 zabbixservermysql
    【转载】web 部署专题(一):Gunicorn运行与配置方法
    supervisor快速配置
    linux监控脚本状态失败后拉起
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/12016714.html
Copyright © 2011-2022 走看看