面試題之逆序打印單鏈表(Java實現)

前提:在不改變原來單鏈表的結構的情況下,逆序打印單鏈表的內容。

實現原理

單鏈表中的一個節點保存的是數據和下一個節點的地址,現在要實現逆序打印單鏈表中的數據值,我們可以藉助棧來實現逆序打印,將每一個節點壓入棧中,利用棧先進後出的特點,最後一個進棧的節點將會最先出棧,正好符合我們所說的逆序打印。

首先判斷單鏈表是否存在有效節點,如果不存在則不能打印節點信息。再遍歷單鏈表,將遍歷出的每個節點放入棧中,再將放入棧中的節點彈出就能實現逆序打印單鏈表

實現代碼

package cn.mrlij.linkedlist;

import java.util.Stack;

/***
 * 單鏈表的實現
 * @author dreamer
 *
 */
public class SingleLinkedList {
	public static void main(String[] args) {
		SingleLinkedListDemo s = new SingleLinkedListDemo();
		HeroNode h1 = new HeroNode(1, "宋江", "及時雨");
		HeroNode h2 = new HeroNode(3, "盧俊義", "玉麒麟");
		HeroNode h3 = new HeroNode(4, "吳用", "智多星");
		HeroNode h4 = new HeroNode(2, "林沖", "豹子頭");
		s.addByOrder(h1);
		s.addByOrder(h2);
		s.addByOrder(h3);
		s.addByOrder(h4);
		System.out.println("正序");
		s.list();

		System.out.println("逆序");
		reversePrintNode(s.getHead());

	}
	
	//逆序打印單鏈表
	public static void reversePrintNode(HeroNode head){
		//若爲空鏈表則無法打印
		if(head.next == null){
			return;
		}
		//創建一個棧
		Stack<HeroNode> heroNodes = new Stack<>();
		//記錄當前節點
		HeroNode cur = head.next;
		//遍歷節點
		while(cur!=null){
			heroNodes.push(cur);
			cur = cur.next;
		}
		while (heroNodes.size()>0){
			System.out.println(heroNodes.pop());
		}
	}
	
}
class SingleLinkedListDemo{
	//創建一個頭結點,初始化數據,頭結點不要動,不放具體的數據

	private HeroNode head = new HeroNode(0,"","");
	public HeroNode getHead() {
		return head;
	}
	//添加英雄
	public void add(HeroNode node) {
		//先找出最後的一個節點,把新加的節點放在最後一個節點的後面
		HeroNode temp = head;
		while(true) {
			if(temp.next == null) {
				break;
			}
			temp = temp.next;
		}
		temp.next = node;
	}
	public void addByOrder(HeroNode node) {
		HeroNode temp = head;
		boolean flag = false;
		while(true) {
			if(temp.next == null) {
				break;
			}
			if(temp.next.no>node.no) {
				break;
			}else if(temp.next.no == node.no) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if(flag) {
			System.out.println("編號"+node.no+"已經存在了!");
		}else {
			node.next = temp.next;
			temp.next = node;
		}
	}
	
	public void list() {
		HeroNode temp = head;
		if(temp.next == null) {
			System.out.println("鏈表爲空!");
			return;
		}
		while(true) {
			if(temp.next == null) {
				break;
			}
			System.out.println(temp.next);
			temp = temp.next;
		}
	}
}
class HeroNode{
	public int no;//英雄編號
	public String name;//人名
	public String nickname;//綽號
	public HeroNode next;//下一個節點
	public HeroNode(int no, String name, String nickname) {
		this.no = no;
		this.name = name;
		this.nickname = nickname;
	}
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
	}



}

如有問題,請與我聯繫!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章