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