从尾到头打印链表

从尾到头打印链表

1、参考资料

https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/

2、题目要求

题目描述

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例

输入:head = [1,3,2]
输出:[2,3,1]

3、基于栈的实现

3.1、代码思路

我们利用栈先进后出的原理,首先正向遍历链表中的每个节点,将其压入栈中,然后,将栈中的元素依次出栈并输出,即是链表的逆序输出

3.2、代码实现

  1. 代码

    public class ReversePrintDemo {
    
    	public static void main(String[] args) {
    
    		SingleLinkedList singleLinkedList = new SingleLinkedList();
    
    		singleLinkedList.add(new Node(1));
    		singleLinkedList.add(new Node(2));
    		singleLinkedList.add(new Node(3));
    		singleLinkedList.add(new Node(4));
    		singleLinkedList.add(new Node(5));
    		singleLinkedList.add(new Node(6));
    
    		System.out.println("顺序输出~~~");
    		singleLinkedList.show();
    		
    		System.out.println("反向输出~~~");
    		singleLinkedList.reversePrint();
    
    	}
    
    }
    
    //链表类
    class SingleLinkedList {
    
    	private Node head = new Node(0);
    
    	public void add(Node node) {
    		// 首节点指针不能移动哦,需要定义辅助指针
    		Node preNode = head;
    		while (preNode.next != null) {
    			preNode = preNode.next;
    		}
    		preNode.next = node;
    	}
    
    	public void show() {
    		// 首节点指针不能移动哦,需要定义辅助指针
    		Node curNode = head.next;
    		while (curNode != null) {
    			System.out.print(curNode.data + "-->");
    			curNode = curNode.next;
    		}
    		System.out.println();
    	}
    
    	public void reversePrint() {
    
    		Stack<Node> stack = new Stack<Node>();
    		Node curNode = head.next;
    
    		// 顺时针遍历链表,将其添加至栈中
    		while (curNode != null) {
    			stack.add(curNode);
    			curNode = curNode.next;
    		}
    
    		// 栈中元素依次出栈
    		while (stack.isEmpty() == false) {
    			System.out.print(stack.pop() + "-->");
    		}
    
    	}
    }
    
    //节点
    class Node {
    	public Integer data;
    	public Node next;
    
    	public Node(Integer data) {
    		this.data = data;
    	}
    
    	public String toString() {
    		return data.toString();
    	}
    }
    
  2. 程序运行结果

    顺序输出~~~
    1-->2-->3-->4-->5-->6-->
    反向输出~~~
    6-->5-->4-->3-->2-->1-->
    

4、基于递归的实现

4.1、代码思路

递归的思路就是:遍历当前节点时,先判断当前节点有没有下一个节点,如果有下一个节点,则先输出下一个节点,再输出当前节点,这样即可逆序输出链表

4.2、代码实现

  1. 代码

    public class RecursionReversePrintDemo {
    
    	public static void main(String[] args) {
    
    		SingleLinkedList singleLinkedList = new SingleLinkedList();
    
    		singleLinkedList.add(new Node(1));
    		singleLinkedList.add(new Node(2));
    		singleLinkedList.add(new Node(3));
    		singleLinkedList.add(new Node(4));
    		singleLinkedList.add(new Node(5));
    		singleLinkedList.add(new Node(6));
    
    		System.out.println("顺序输出~~~");
    		singleLinkedList.show();
    
    		System.out.println("反向输出~~~");
    		singleLinkedList.reversePrint();
    
    	}
    
    }
    
    //链表类
    class SingleLinkedList {
    
    	private Node head = new Node(0);
    
    	public void add(Node node) {
    		// 首节点指针不能移动哦,需要定义辅助指针
    		Node preNode = head;
    		while (preNode.next != null) {
    			preNode = preNode.next;
    		}
    		preNode.next = node;
    	}
    
    	public void show() {
    		// 首节点指针不能移动哦,需要定义辅助指针
    		Node curNode = head.next;
    		while (curNode != null) {
    			System.out.print(curNode.data + "-->");
    			curNode = curNode.next;
    		}
    		System.out.println();
    	}
    
    	// 递归逆序打印链表
    	public void reversePrint() {
    		reversePrint(head.next); // 起始位置为首节点
    	}
    
    	// 递归逆序打印链表
    	public void reversePrint(Node node) {
    		// 如果 node 还有下一个节点,则不能打印 node,需要先打印其下一个节点
    		if (node.next != null) {
    			reversePrint(node.next);
    		}
    		// 打印完 node 的下一个节点之后,输出 node 节点本身
    		System.out.print(node + "-->");
    	}
    }
    
    //节点
    class Node {
    	public Integer data;
    	public Node next;
    
    	public Node(Integer data) {
    		this.data = data;
    	}
    
    	public String toString() {
    		return data.toString();
    	}
    }
    
  2. 程序运行结果

    顺序输出~~~
    1-->2-->3-->4-->5-->6-->
    反向输出~~~
    6-->5-->4-->3-->2-->1-->
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值