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;
}
}
}