【题目】Problem C.链表操作

Problem_C(链表操作):

一个出值为 1,2,3,4,…,n的n(0<n<=50)个节点的顺序链表,有以下3种操作方式:
1 移除节点值为x的节点
2 翻转链表,对调整个链表的顺序
3 查询链表值为x的节点所指的下一个节点的值

输入:
第一行输入T,表示数据的组数
每组第一行输入 n (表示节点数目) m (表示操作数目)
接下来m行分别输入 ope (操作方式) x (操作的节点值,操作方式为2时不会输入该值)

1
6 6
3 6
1 2
3 1
2
1 5
3 6

输出:

输出操作为3查询时,所查节点所指的下一个节点值,若没有查到或查到的节点为表尾 (没有下一节点),输出"NONE"

NONE
3
4

备注:使用了双链表,可能单链表更快

import java.util.LinkedList;
import java.util.Scanner;

public class Test{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			int n = scanner.nextInt();
			for(int i = 0; i < n; i++) {
				int num = scanner.nextInt();
				int sum = scanner.nextInt();
				ListNode ll = new ListNode(1);
				ListNode head = ll;
				head.prior = null;
				for(int j = 1; j < num; j++) {
					ll.next = new ListNode(j + 1);
					ListNode pro = ll;
					ll = ll.next;
					ll.prior = pro;
				}
				ListNode end = ll;
				ll = head;
				int revser = 0;
				for(int j = 0; j < sum; j++) {
					int choice = scanner.nextInt();
					if (choice == 1) {
						int target = scanner.nextInt();
						if(revser % 2 == 0) {
							while(ll.next != null) {
								if(ll.val == target) break;
								ll = ll.next;
							}
							if(ll.next == null) {
								ll.prior.next = null;
							}else {
								ll.prior.next = ll.next;
								ll.next.prior = ll.prior;
							}
						}else {
							while(ll.prior != null) {
								if(ll.val == target) break;
								ll = ll.prior;
							}
							if(ll.prior == null) {
								ll.next.prior = null;
							}else {
								ll.next.prior = ll.prior;
								ll.prior.next = ll.next;
							}
						}
						ll = head;
					}else if(choice == 2) {
						head = end;
						end = ll;
						ll = head;
						revser++;
					}else if(choice == 3) {
						int target = scanner.nextInt();
						if(revser % 2 == 0) {
							while(ll.next != null) {
								if(ll.val == target) break;
								ll = ll.next;
							}
							if(ll.next == null || ll.val != target) System.out.println("NONE");
							else System.out.println(ll.next.val);
						}
						else {
							while(ll.prior != null) {
								if(ll.val == target) break;
								ll = ll.prior;
							}
							if(ll.prior == null || ll.val != target) System.out.println("NONE");
							else System.out.println(ll.prior.val);
						}
						ll = head;
					}
				}
			}
		}
	}

	public static class ListNode {
		int val;
		ListNode next;
		ListNode prior;
		ListNode(int x) { 
			val = x;
			next = null;
			prior = null;
		}
  }
}
发布了233 篇原创文章 · 获赞 254 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_44485744/article/details/104886521