在一行上:
先输入一个整数
代表链表中节点的总数;
随后输入一个整数
代表头节点的值;
随后输入
个二元组
;
最后输入一个整数
,代表需要删除的节点值。
除此之外,保证每一个
值在输入前已经存在于链表中;每一个
值在输入前均不存在于链表中。节点的值各不相同。
在一行上输出
个整数,代表删除指定元素后剩余的链表。
5 2 3 2 4 3 5 2 1 4 3
2 5 4 1
在这个样例中,链表的构造过程如下:
头节点为
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
随后,删除值为
的节点,得到链表
。
6 2 1 2 3 2 5 1 4 5 7 2 2
7 3 1 5 4
在这个样例中,链表的构造过程如下:
头节点为
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
随后,删除值为
的节点,得到链表
。
本题由牛客重构过题面,您可能想要阅读原始题面,我们一并附于此处。
【以下为原始题面】
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
构造过程,例如输入一行数据为:6 2 1 2 3 2 5 1 4 5 7 2 2则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩下的2个一组表示第2个节点值后面插入第1个节点值,为以下表示:1 2 表示为2->1链表为2->13 2表示为2->3链表为2->3->15 1表示为1->5链表为2->3->1->54 5表示为5->4链表为2->3->1->5->47 2表示为2->7链表为2->7->3->1->5->4最后的链表的顺序为 2 7 3 1 5 4最后一个参数为2,表示要删掉节点为2的值删除 结点 2
则结果为 7 3 1 5 4数据范围:链表长度满足,节点中的值满足
测试用例保证输入合法
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNext()) { // 注意 while 处理多个 case String s = in.nextLine(); String[] strArr = s.split(" "); int[] arr = new int[strArr.length]; for (int i = 0; i < arr.length; i++) { arr[i] = Integer.parseInt(strArr[i]); } int num = arr[0];//节点数 int head = arr[1];//头元素 int del = arr[arr.length - 1];//要删除的元素 LinkedList<Integer> list = new LinkedList<>(); list.add(head); //6 2 1 2 3 2 5 1 4 5 7 2 2 for (int i = 2; i <= (num - 1) * 2; i += 2) { int pre = arr[i + 1]; int next = arr[i]; int index = list.indexOf(pre); list.add(index + 1, next); } //删除节点 list.remove((Integer) del); list.forEach(o -> System.out.print(o + " ")); } } }
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int nodes = in.nextInt(); LinkedNode head = new LinkedNode(in.nextInt()); for (int i = 1; i < nodes; i++) { int data = in.nextInt(); int pre = in.nextInt(); LinkedNode current = head; while (current.data != pre) { current = current.next; } current.next = new LinkedNode(data, current.next); } int toRemove = in.nextInt(); if(head.data == toRemove) { head = head.next; } else { LinkedNode current = head; while (current.next.data != toRemove) { current = current.next; } current.next = current.next.next; } StringBuilder sb = new StringBuilder(); LinkedNode current = head; while (current != null) { sb.append(current.data).append(" "); current = current.next; } System.out.println(sb.toString().trim()); } } class LinkedNode { int data; LinkedNode next; LinkedNode(int data) { this.data = data; this.next = null; } LinkedNode(int data, LinkedNode next) { this.data = data; this.next = next; } boolean hasNext() { return this.next != null; } boolean isLast() { return this.next == null; } }
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextLine()) { // 注意 while 处理多个 case String s = in.nextLine(); String[] arr = s.split(" "); int n = Integer.valueOf(arr[0]);//子链数量 int head = Integer.valueOf(arr[1]);//头元素 int delete = Integer.valueOf(arr[arr.length - 1]);//要删除的元素 LinkedList<Integer> list= new LinkedList<Integer>(); list.add(head); for (int i = 0; i < (n - 1) * 2; i+=2) { int one = Integer.valueOf(arr[i+2]);//获取要插入的第一个元素 int two = Integer.valueOf(arr[i+3]);//获取要插入的第二个元素 int index = list.indexOf(two);//获取要插入的第二个元素索引 list.add(index+1,one);//从第二个元素索引尾插 } list.remove(list.indexOf(delete));//删除要删除的元素 for (Integer i : list) { System.out.print(i + " "); } } } }
import java.util.Scanner; class Node { private Node next; private int value; public Node(int value) { this.value = value; } public int getValue() { return this.value; } public Node getNext() { return this.next; } public void setNext(Node next) { this.next = next; } } // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 String inputStr = in.nextLine(); String[] strArr = inputStr.split(" "); int length = Integer.parseInt(strArr[0]); if (length > 1) { int headValue = Integer.parseInt(strArr[1]); int secondValue = Integer.parseInt(strArr[2]); Node second = new Node(secondValue); Node head = new Node(headValue); head.setNext(second); Node current = head; Node pre; for (int i = 4; i < strArr.length - 2; i = i + 2) { int value = Integer.parseInt(strArr[i]); int afValue = Integer.parseInt(strArr[i + 1]); Node newNode = new Node(value); current = head; while (current != null) { if (afValue == current.getValue()) { newNode.setNext(current.getNext()); current.setNext(newNode); break; } current = current.getNext(); } } /* current = head; while(current!=null){ System.out.print(current.getValue()+" "); current = current.getNext(); } System.out.println(); */ Node delNode = new Node(Integer.parseInt(strArr[strArr.length - 1])); current = head; pre = head; while (current != null) { if (current.getValue() == delNode.getValue()) { if (current.equals(head)) { head = current.getNext(); } pre.setNext(current.getNext()); } pre = current; current = current.getNext(); } current = head; while (current != null) { System.out.print(current.getValue() + " "); current = current.getNext(); } System.out.println(); } else { if (strArr[1].equals(strArr[2])) { System.out.println(); } else { System.out.println(strArr[1]); } } } }
import java.util.Scanner; public class T47 { public static void main(String[] args) { class ListNode { int value; ListNode next; ListNode(int x) { this.value = x; } } Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { String s = sc.nextLine(); String[] split = s.split(" "); int number = Integer.parseInt(split[0]); //默认在创建链表过程中,头节点不会改变 int headValue = Integer.parseInt(split[1]); int delete = Integer.parseInt(split[split.length - 1]); ListNode head = new ListNode(headValue); //构建链表 for (int i = 0; i < number - 1; i++) { int index = 2 + i * 2; int firstValue = Integer.parseInt(split[index]); int secondValue = Integer.parseInt(split[index + 1]); ListNode temp = head; while (true) { if (temp.value == secondValue) { if (temp.next == null) { ListNode listNode = new ListNode(firstValue); temp.next = listNode; break; } else { ListNode listNode = new ListNode(firstValue); listNode.next = temp.next; temp.next = listNode; break; } } else { temp = temp.next; } } } //删除指定元素对应的节点 if (head.value == delete) { head = head.next; } else { ListNode temp = head; while (true) { if (temp.next.value == delete) { if (temp.next.next == null) { temp.next = null; break; } else { temp.next = temp.next.next; break; } } else { if (temp.next == null) { break; } else { temp = temp.next; } } } } ListNode temp = head; String result = ""; //节点全部被删除的情况 if (temp == null) { System.out.println(""); return; } //有节点的情况下,将所有value值拼接上去 while (true) { result += temp.value + " "; if (temp.next == null) { break; } else { temp = temp.next; } } System.out.println(result); } } }
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); Node head = new Node(); head.value = in.nextInt(); for (int i = 0; i < n - 1; i++) { int value = in.nextInt(); int next = in.nextInt(); for (Node p = head; p != null; p = p.next) { if (p.value == next) { Node node = new Node(); node.value = value; node.next = p.next; p.next = node; } } } int m = in.nextInt(); if (head.value == m) { head = head.next; } else { for (Node p = head; p.next != null; p = p.next) { if (p.next.value == m) { p.next = p.next.next; } } } for(Node p = head; p != null; p = p.next){ System.out.print(p.value+" "); } } } class Node { int value; Node next; }
import java.util.Scanner; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.StringJoiner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = br.readLine(); String[] split = line.split(" "); // 组数 int cnt = Integer.parseInt(split[0]); // 头部元素 int header = Integer.parseInt(split[1]); // 要删除的元素 Integer delete = Integer.parseInt(split[split.length - 1]); // 业务场景为链表 LinkedList<Integer> list = new LinkedList<>(); // 添加头元素 list.add(header); for (int i = 0; i < (cnt - 1) * 2; i = i + 2) { Integer a = Integer.parseInt(split[i + 2]); Integer b = Integer.parseInt(split[i + 2 + 1]); // 获取要插入元素的位置 int index = list.indexOf(b); // 插入元素 list.add(index + 1, a); //System.out.println(list.toString()); } // 删除元素 list.remove(delete); // 拼接打印 StringJoiner sj = new StringJoiner(" ", "", ""); for (Integer integer : list) { sj.add(integer + ""); } System.out.println(sj); } }
import java.util.Scanner; import java.util.Stack; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { String text = scanner.nextLine(); min(text); } } public static void min(String text) { String[] strings = text.split(" "); int num = Integer.valueOf(strings[0]); String headV = strings[1]; String removeV = strings[strings.length - 1]; Stack<String> stack = new Stack<>(); Stack<String> otherStack = new Stack<>(); stack.push(headV); for (int i = 3; i < strings.length - 1; i += 2) { String v2 = strings[i]; String v1 = strings[i - 1]; if (stack.peek().equals(v2)) { stack.push(v1); } else { while (!stack.peek().equals(v2)) { otherStack.push(stack.peek()); stack.pop(); } stack.push(v1); while (!otherStack.isEmpty()) { stack.push(otherStack.pop()); } } } String[] values = new String[stack.size()]; for (int i = values.length - 1; i >= 0; i--) { values[i] = stack.pop(); } String s = ""; for (int i = 0; i < values.length; i++) { String string = values[i]; if (!string.equals(removeV)) { s = s.equals("") ? string : s + " " + string; } } System.out.print(s); } }
import java.io.*; //创建节点,next为当前节点所指向的下一个节点,val为当前节点值 class Node { Node next; int val; Node(int val) { this.val = val; next = null; } } public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] strArr = br.readLine().split(" "); int len = Integer.parseInt(strArr[0]); //创建头节点 Node head = new Node(Integer.parseInt(strArr[1])); for (int i = 1; i < len; i++) { //两个节点作为一组的第一个节点 int v1 = Integer.parseInt(strArr[2 * i]); //两个节点作为一组的第二个节点 int v2 = Integer.parseInt(strArr[2 * i + 1]); Node temp = head; /*v1节点要插到v2节点后,所以先循环找到链表中v2节点,并将临时节点指向v2节点 然后将v2节点指向新增的v1节点,v1节点则指向v2原来所指的位置 本题测试用例均默认每一组节点中,在将v1插入v2后面的过程,v2节点已存在链表中 因此整个解题过程可理解为按两个一组,在链表中寻找v2,并将v1插入v2后边 */ while (v2 != temp.val) temp = temp.next; //创建v1节点 Node node = new Node(v1); //将v1节点指向链表中v2节点所指位置,当前temp指向v2节点,temp的next即为节点v2的next node.next = temp.next; //将节点v2的next指向v1节点node,temp的next即为节点v2的next temp.next = node; } //找到要删除节点的索引,即字符串最后一个元素 int indexOfDelete = Integer.parseInt(strArr[strArr.length - 1]); //创建临时节点用于遍历 Node temp = head; StringBuilder sb = new StringBuilder(); //temp不为空时一直拼接 while (temp != null) { //遇到要删除的节点不拼接 if (temp.val != indexOfDelete) sb.append(temp.val).append(" "); //拼接当前节点值后,temp需要指向链表的下一个节点,已完成下个节点值的拼接 temp = temp.next; } System.out.println(sb.toString()); } }