首页 > 其他分享 >剑指offer系列:从尾到头打印链表

剑指offer系列:从尾到头打印链表

时间:2022-08-18 11:55:16浏览次数:61  
标签:head ListNode val offer next 链表 从尾 NULL

Java实现方式

描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

代码

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.*;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
/*      //根据方法返回值类型,首先可以想到头插ArrayList的方法
        ArrayList<Integer> list = new ArrayList<Integer>();
        while(listNode != null){
            list.add(0,listNode.val);
            listNode = listNode.next;
        }
        return list;
*/
/*      //根据栈后进先出的特点实现
        ArrayList<Integer> list = new ArrayList<Integer>();
        Stack<Integer> stack = new Stack<Integer>();
        while(listNode != null){
            stack.push(listNode.val);
            listNode = listNode.next;
        }
        while(!stack.isEmpty()){
            list.add(stack.pop());
        }
        return list;
*/
        //递归,每访问一个结点的时候,先递归输出它后面的结点
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(listNode != null){
            list = printListFromTailToHead(listNode.next);
            list.add(listNode.val);
        }
        return list;     
    }
}


C++实现方式
1.递归

思路

  1. 设计一个函数:递归反转链表先,然后调整递归的代码;
  2. 然后把链表的值插入到数组;

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

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

 * };

 */

class Solution {

public:

    vector<int> reversePrint(ListNode* head) {

        vector<int> v; //用来存放链表的值

//递归得到反转后的链表

        ListNode* newHead =  reverse(head);

//插入反转后的链表的值入数组v

        ListNode* cur =newHead;

        while(cur !=NULL){

            v.push_back(cur->val);

            cur = cur->next;

        }

        return v;

    }

private:

//反转函数

    ListNode* reverse(ListNode* head){

//如果链表为空或者只有一个结点,直接返回头指针

       if(head == NULL  || head->next == NULL){           

           return head;

        }

        //递归调用head->next后面的链表

        ListNode* newHead = reverse(head->next);

        //调整递归后的链表

        //head->next->next是指向最后一个结点的指针

        head->next->next = head;

        //修改最后一个结点的指针为NULL

        head->next = NULL;

        //返回新的头结点

        return newHead;

    }

};

 

2.头插法实现思路及其实现代码

思路:

头插时候,先处理要头插数据的下一个结点,所以要保存将要头插结点的指针定义一个临时指针temp = head->next; 于此同时定义一个新指针 newHead = NULL;
处理将要头插的数据:即head = newHead;
处理头插前面的结点:newHead ->next = head;
处理结束后:旧头结点继续往前移动 head = temp;
开始插入数据入数组!

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

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

 * };

 */

class Solution {

public:

    vector<int> reversePrint(ListNode* head) {

        vector<int> v;

        ListNode* newHead =  reverse(head);

        ListNode* cur =newHead;

        

        while(cur !=NULL){

            v.push_back(cur->val);

            cur = cur->next;

        }

 

        return v;

    }

private:

    ListNode* reverse(ListNode* head){

 

        if(head == NULL  || head->next == NULL){           

            return head;

        }

       ListNode* newHead = NULL;

       //让头指针遍历链表进行头插

       while(head !=NULL){

           ListNode* temp = head->next;

           head->next = newHead;

           newHead = head;

           head = temp;

       }           

        return newHead;

    }

};

 

3.栈模拟思路及其代码实现

思路:
由于栈的先进后出和这里的从尾打印链表刚好吻合,所以可以用栈来完成。

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

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

 * };

 */

class Solution {

public:

    vector<int> reversePrint(ListNode* head) {

         stack<int> stk;

        vector<int> v;

        //开始入栈

        while(head != NULL){

            stk.push(head->val);

            //链表迭代往下走

            head = head->next;

        }

        //开始出栈到数组

        while(!stk.empty()){

            v.push_back(stk.top());

            stk.pop(); //记得弹栈

        }

        return v;

    }  

};

 

标签:head,ListNode,val,offer,next,链表,从尾,NULL
From: https://www.cnblogs.com/sundayvc/p/16598190.html

相关文章

  • 剑指 Offer 07. 重建二叉树
    剑指Offer07.重建二叉树题目大意输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。......
  • 2022-8-17 剑指offer-二叉树-递归
    剑指OfferII054.所有大于等于节点的值之和难度中等35收藏分享切换为英文接收动态反馈给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值......
  • 分隔链表
    目录题目描述解题思路解题代码题目描述题目地址:https://leetcode.cn/problems/partition-list/题目要求给你一个链表的头节点head和一个特定值x,请你对链表进行分隔,......
  • 剑指Offer-62-圆圈中最后剩下的数字
    约瑟夫环问题已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出圈;他的下一个人又从1开始报数,数到m的那个人又出圈;依此......
  • 阿里工作8年,肝到P7就剩这份学习笔记了,已助朋友拿到10个Offer
    在阿里工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P7也费了不少心思,小编也是个爱学习的人,把这几年的工作经验整理成......
  • 2022-8-16 剑指offer-二叉树
    剑指OfferII053.二叉搜索树中的中序后继难度中等57收藏分享切换为英文接收动态反馈给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果......
  • LeetCode 反转链表算法题解 All In One
    LeetCode反转链表算法题解AllInOnejs/ts实现反转链表反转链表原理图解双指针,swap交换//反转双指针//swap:a=b;c=a;b=c;letprev:List......
  • 删除链表的倒数第 N 个结点
    题目描述题目地址:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/题目要求:给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。解题思路......
  • 合并两个排序的链表
    目录题目描述解题思路解题代码题目描述题目地址:http://mtw.so/6r71s0题目要求:输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的......
  • django ORM定义实现链表结构
    需求场景各种链表使用场景,如单串,双端链表等需求描述实现阶段间串联的可前进后退的关系模型逻辑分析节点间串联.主要需要控制的是前节点和后节点的顺序关系以及......