欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PTA 带头节点的双向循环链表操作

程序员文章站 2022-03-16 08:50:07
...

题目要求:读入一系列整数,依次插入到双向循环链表的头部和尾部,然后顺序和逆序输出链表。

输入格式:
输入一行整数(空格分隔),以-1结束。

输出格式:
第一行输出链表顺序遍历的结果,第二行输出逆序遍历的结果。

输入样例:
在这里给出一组输入。例如:

1 2 3 4 5 6 -1

输出样例:

5 3 1 2 4 6
6 4 2 1 3 5
import java.util.Scanner;

// 链表节点
class Node{
	int val;
	Node pre;
	Node next;
	Node(int val, Node pre, Node next){
		this.val = val;
		this.pre = pre;
		this.next = next;
	}
}

public class Main {
	// 头指针作为前置节点
	public static Node head = new Node(0, null, null);
	public static Node tail = head;
	
	public static void main(String[] args) {
		
		Scanner cin = new Scanner(System.in);
		int n = 0, f = 0;
		while((n = cin.nextInt()) != -1) {
			if(f++ % 2 == 0) {
				addFirst(n);
			}else {
				addLast(n);
			}
		}
		
		showPre();
		System.out.println();
		showPost();
	}
	
	// 从头部插入
	public static void addFirst(int n) {
		Node old = head.next;
		Node t = new Node(n, head, old);
		head.next = t;
		if(head == tail) {
			tail = t;
		}else {
			old.pre = t;
		}
	}
	
	// 插入尾巴节点
	public static void addLast(int n) {
		Node t = new Node(n, tail, null);
		tail.next = t;
		tail = t;
	}
	
	// 前序遍历
	public static void showPre() {
		Node t = head.next;
		while(t != null) {
			if(t.next == null)
				System.out.print(t.val);
			else
				System.out.print(t.val + " ");
			t = t.next;
		}
	}
	
	// 倒序遍历
	public static void showPost() {
		Node t = tail;
		while(t != head) {
			if(t.pre == head)
				System.out.print(t.val);
			else
				System.out.print(t.val + " ");
			t = t.pre;
		}
	}
}
相关标签: 链表 java