【題目】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;
		}
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章