其他分享
首页 > 其他分享> > 面试题6:从尾到头打印链表

面试题6:从尾到头打印链表

作者:互联网

题目:输入一个链表的头节点,从尾到头反过来打印出每个系欸但的值。链表节点定义如下
本实现方法有头节点,头节点没有数据域

class Node{
	int value;
	Node next;
	
	public Node() {
	}
	public Node(int value) {
		this.value = value;
	}
		
	@Override
	public String toString() {
		return "Node [value=" + value + "]";
	}
}

第一种方法:使用栈结构打印

// 反向遍历链表  从未到头打印
	public void PrintListReversingly_IterativeLy(){ 
		if(head==null || head.next==null){
			throw new IllegalArgumentException("头节点为空,或链表为空");
		}
		// 利用栈结构将链表节点传入先进后出实现反向打印
		Stack<Node>	stack = new Stack<Node>();
		
		// 遍历链表将 遍历到的节点装入栈中
		//设置游标节点 第一个有效节点设为开始游标节点
		Node temp=head.next;
		
		while(temp!=null){
			// 将节点装如栈中
			stack.push(temp);
			// 接着往下遍历
			temp=temp.next;
		}
		
		// 一次将栈弹出
		while(!stack.empty()){
			System.out.println(stack.pop());
		}
	}

第二种:利用递归方法从尾到头

	// 递归打印节点
	public void PrintListReversingly_Recursively(Node head){
		if(head!=null){
			if(head.next.next!=null){
				PrintListReversingly_Recursively(head.next);
			}
			System.out.println(head.next);
		}
	}

完整源代码:

package com.basic;

import java.util.Scanner;
import java.util.Stack;

public class Queue_01 {
	// 创建头节点
	private static Node head=new Node(0);
	
	public static void main(String[] args) {
		Queue_01 queue = new Queue_01();
		Scanner sc=new Scanner(System.in);
		boolean isOK=true;
		while(isOK){
			System.out.println("输入  1 添加链表节点   2反序打印链表   3递归遍历  4退出");
			char c=sc.next().charAt(0);
			switch (c) {
			case '1':
				try{
					System.out.println("请输入想要添加的节点数字");
					String i=sc.next();
					Queue_01.Node node = new Queue_01.Node(Integer.parseInt(i));
					queue.AddByOrder(node);
				}catch(Exception e){
					System.out.println(e.getMessage());
				}
				break;
			case '2':
				try{
					queue.PrintListReversingly_IterativeLy();
				}catch(Exception e){
					System.out.println(e.getMessage());
				}
				break;
			case '3':
				queue.PrintListReversingly_Recursively(head);
				break;
			case '4':
				isOK=false;
				break;
			}
		}
	}
	
	public void AddByOrder(Node newNode){
		if(newNode==null){
			throw new IllegalArgumentException("传入节点有误,添加失败");
		}
		// 设立指针游标节点
		Node temp=head;
		// 设置添加标志位
		boolean isOK=false;
		
		// 开始遍历寻找插入位置 找到插入节点的上一个节点
		while(true){
			if(temp.next==null){
				// 说明当前节点应该插入到尾部
				break;
			}else if(temp.next.value==newNode.value){
				// 说明存在重复节点 不插入
				isOK=true;
				break;
			}else if(temp.next.value > newNode.value){
				// 找到了插入的位置
				break;
			}
			// 没有找到一直往下遍历 知道末尾节点
			temp=temp.next;
		}
		
		// 利用标志位 决定是否加入节点
		if(!isOK){
			// 将游标节点的下一个节点设置为新节点的下一个节点
			newNode.next=temp.next;
			// 将游标节点的下一个节点设置为新节点
			temp.next=newNode;
		}
	}
	
	// 反向遍历链表  从未到头打印
	public void PrintListReversingly_IterativeLy(){ 
		if(head==null || head.next==null){
			throw new IllegalArgumentException("头节点为空,或链表为空");
		}
		// 利用栈结构将链表节点传入先进后出实现反向打印
		Stack<Node>	stack = new Stack<Node>();
		
		// 遍历链表将 遍历到的节点装入栈中
		//设置游标节点 第一个有效节点设为开始游标节点
		Node temp=head.next;
		
		while(temp!=null){
			// 将节点装如栈中
			stack.push(temp);
			// 接着往下遍历
			temp=temp.next;
		}
		
		// 一次将栈弹出
		while(!stack.empty()){
			System.out.println(stack.pop());
		}
	}
	
	// 递归打印节点
	public void PrintListReversingly_Recursively(Node head){
		if(head!=null){
			if(head.next.next!=null){
				PrintListReversingly_Recursively(head.next);
			}
			System.out.println(head.next);
		}
	}
	
	static	class Node{
		int value;
		Node next;
		
		public Node() {
		}

		public Node(int value) {
			this.value = value;
		}

		@Override
		public String toString() {
			return "Node [value=" + value + "]";
		}
		
	}
}

此代码思路参考剑指offer 面试题

标签:Node,面试题,temp,head,value,next,链表,从尾,节点
来源: https://blog.csdn.net/qq_37203436/article/details/120231570