题解 | #【模板】链表#
【模板】链表
https://www.nowcoder.com/practice/97dc1ac2311046618fd19960041e3c6f
/**
* @author SuperStar1946
* @description:这是我在本地idea中写的java代码,因为备注信息比较全,也便于调教,所以粘贴的这个,删除大部分输出就可以满足题目要求了。
* @create 2022-10-08-11:10
*/
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
Scanner in = new Scanner(System.in);
System.out.print("请输入操作次数(大于等于1,小于等于10000): ");
int times = in.nextInt();
while (times <1 || times >10000){
System.out.println("输入的数据非法,请重新输入!");
times = in.nextInt();
}
System.out.println();
int count = 0;
// 注意 hasNext 和 hasNextLine 的区别
while (count < times) { // 注意 while 处理多个 case
System.out.println("请选择操作,i为插入节点,d为删除节点。");
String select = in.next();
switch (select){
case "i":
System.out.print("insert\t");
int a = in.nextInt();
int b = in.nextInt();
System.out.println();
Node x = new Node(a);
Node y = new Node(b);
singleLinkedList.insert(x,y);
singleLinkedList.showList();
break;
case "d":
System.out.print("delete\t");
int c = in.nextInt();
Node node = new Node(c);
System.out.println();
singleLinkedList.deleteList(node);
singleLinkedList.showList();
break;
default:throw new RuntimeException("输入错误,程序结束。");
}
count++;
}
}
}
class SingleLinkedList{
Node head = new Node(-1);
//插入节点
void insert(Node x,Node y){
//链表指针
Node index = head;
//判断是否找到x,找到x则为真,没有找到为false。
boolean flag = false;
if(index.next ==null){
System.out.println("链表为空,节点y插入到链表末尾。");
head.next = y;
return;
}
if (x == null|| y ==null) {
System.out.println("输入的节点为空,无法插入节点。");
return;
}
while (index.next != null){
//判断是否存在x,如果存在x,则插入x结点之前
if(index.next.id == x.id){
y.next = index.next;
index.next = y;
System.out.println("插入成功,节点y插入到x的前面。");
flag = true;
return;
}
//迭代
index = index.next;
}
//没有找到x,则插入到链表的末尾
if(!flag){
index.next = y;
System.out.println("插入成功,节点y插入到链表的末尾。");
return;
}
}
//显示链表
void showList(){
Node index = head.next;
if(index == null){
System.out.println("NULL");
return;
}
System.out.print("输出链表:");
while (index!= null){
System.out.print(index+"\t");
index = index.next;
}
System.out.println();
}
//删除节点
void deleteList(Node node){
//判断是否找到要删除的节点
boolean flag = true;
if (node == null) {
System.out.println("节点为空,无法删除。");
return;
}
Node index = head;
if(index.next == null){
System.out.println("链表为空,无法删除。");
return;
}
while (index.next !=null){
if(index.next.id == node.id){
flag = false;
index.next = index.next.next;
System.out.println("节点删除成功,节点id为:"+node.id);
return;
}
//迭代
index = index.next;
}
if(flag){
System.out.println("没有找到要删除的节点,无法删除。");
return;
}
}
}
class Node{
int id;
Node next;
public Node(){
}
public Node(int x) {
this.id = x;
}
@Override
public String toString() {
return id+"";
}
}
#Java开发#
* @author SuperStar1946
* @description:这是我在本地idea中写的java代码,因为备注信息比较全,也便于调教,所以粘贴的这个,删除大部分输出就可以满足题目要求了。
* @create 2022-10-08-11:10
*/
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
Scanner in = new Scanner(System.in);
System.out.print("请输入操作次数(大于等于1,小于等于10000): ");
int times = in.nextInt();
while (times <1 || times >10000){
System.out.println("输入的数据非法,请重新输入!");
times = in.nextInt();
}
System.out.println();
int count = 0;
// 注意 hasNext 和 hasNextLine 的区别
while (count < times) { // 注意 while 处理多个 case
System.out.println("请选择操作,i为插入节点,d为删除节点。");
String select = in.next();
switch (select){
case "i":
System.out.print("insert\t");
int a = in.nextInt();
int b = in.nextInt();
System.out.println();
Node x = new Node(a);
Node y = new Node(b);
singleLinkedList.insert(x,y);
singleLinkedList.showList();
break;
case "d":
System.out.print("delete\t");
int c = in.nextInt();
Node node = new Node(c);
System.out.println();
singleLinkedList.deleteList(node);
singleLinkedList.showList();
break;
default:throw new RuntimeException("输入错误,程序结束。");
}
count++;
}
}
}
class SingleLinkedList{
Node head = new Node(-1);
//插入节点
void insert(Node x,Node y){
//链表指针
Node index = head;
//判断是否找到x,找到x则为真,没有找到为false。
boolean flag = false;
if(index.next ==null){
System.out.println("链表为空,节点y插入到链表末尾。");
head.next = y;
return;
}
if (x == null|| y ==null) {
System.out.println("输入的节点为空,无法插入节点。");
return;
}
while (index.next != null){
//判断是否存在x,如果存在x,则插入x结点之前
if(index.next.id == x.id){
y.next = index.next;
index.next = y;
System.out.println("插入成功,节点y插入到x的前面。");
flag = true;
return;
}
//迭代
index = index.next;
}
//没有找到x,则插入到链表的末尾
if(!flag){
index.next = y;
System.out.println("插入成功,节点y插入到链表的末尾。");
return;
}
}
//显示链表
void showList(){
Node index = head.next;
if(index == null){
System.out.println("NULL");
return;
}
System.out.print("输出链表:");
while (index!= null){
System.out.print(index+"\t");
index = index.next;
}
System.out.println();
}
//删除节点
void deleteList(Node node){
//判断是否找到要删除的节点
boolean flag = true;
if (node == null) {
System.out.println("节点为空,无法删除。");
return;
}
Node index = head;
if(index.next == null){
System.out.println("链表为空,无法删除。");
return;
}
while (index.next !=null){
if(index.next.id == node.id){
flag = false;
index.next = index.next.next;
System.out.println("节点删除成功,节点id为:"+node.id);
return;
}
//迭代
index = index.next;
}
if(flag){
System.out.println("没有找到要删除的节点,无法删除。");
return;
}
}
}
class Node{
int id;
Node next;
public Node(){
}
public Node(int x) {
this.id = x;
}
@Override
public String toString() {
return id+"";
}
}