java输出头结点,剑指Offer_编程题_从尾到头打印链表,

剑指Offer_编程题_从尾到头打印链表,

题目描述

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

答案

有三种思路,

第一就是利用栈先入后出的特性完成,

第二就是存下来然后进行数组翻转。

第三是利用递归。

// 数组反转实现方式

作者:小辉哥哥

链接:https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035?f=discussion

来源:牛客网

292cb124972ef7b0de648740db131312.png

public class Solution {

public ArrayList printListFromTailToHead(ListNode listNode) {

ArrayList list=new ArrayList();

ListNode pre=null;

ListNode next=null;

while(listNode!=null){

next=listNode.next;

listNode.next=pre;

pre=listNode;

listNode=next;

}

while(pre!=null){

list.add(pre.val);

pre=pre.next;

}

return list;

}

}

链接:https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035?f=discussion

来源:牛客网

java 递归超简洁版本

public class Solution {

ArrayList arrayList=new ArrayList();

public ArrayList printListFromTailToHead(ListNode listNode) {

if(listNode!=null){

this.printListFromTailToHead(listNode.next);

arrayList.add(listNode.val);

}

return arrayList;

}

}

创建链表相关,头插法和尾插法

53f35d0304a83b27dbf1e1404aed7384.png

关于头插法,可以next可以理解成前一个节点地址,插入顺序:

1、头节点传入,开始创建A数据,头节点的next指向A数据的内存地址,A节点的next替换成头节点的

2、头节点再传入,创建B数据,头节点的next又换成了指向B的内存地址,B节点的next替换头节点的A;

总结一下:插入时候,一直在头节点的上面插入数据,原来的数据被“顶”上去了;

头插法遍历的时候,头节点开始,一个一个往上遍历。这样最后插入的就作为第一个输出出来了;

尾插法编练插入,比较好理解,就是一直在“尾巴”追加,遍历时候从头开始,第一个插入的就第一个输出出来;

public class Test {

static Node headNode;

class Node {

private Node next;//指针

private int data;//数据域

}

//尾插法创建单链表 队列形式先进先出

public void back(Node node, int data) {

if (data < 10) {

Node next = new Node();

next.data = data;

next.next = null;

node.next = next;

back(next, ++data);

}

}

//头插法创建单链表 栈形式先进后出

public void head(Node node, int data) {

if (data < 10) {

Node next = new Node();

next.next = node.next;

next.data = data;

node.next = next;

System.out.println("递归参数:" + node.data);

head(node, ++data);

}

}

public static void main(String[] args) {

Test test = new Test();

headNode = test.new Node();//头指针

// new Test().back(headNode, 0);//前插法

new Test().head(headNode, 0);//后插法

System.out.println("创建后的链表是:");//0 1 2 3 4 5 6 7 8 9 10

while (headNode.next != null) {

headNode = headNode.next;

System.out.print(headNode.data + " ");

}

}

}

//————————————————

//版权声明:本文为CSDN博主「另一个绝影」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

//原文链接:https://blog.csdn.net/weixin_37817685/article/details/83305972

相关文章暂无相关文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值