From ec1aea6fe89f50f62de8f7372685afcc5aa4a860 Mon Sep 17 00:00:00 2001 From: liangjinglin Date: Sun, 12 Jan 2025 17:43:18 +0800 Subject: [PATCH] =?UTF-8?q?2025-01-12=20=E5=8F=8C=E5=90=91=E9=93=BE?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/LinkedList/DoubleLinkedList.java | 175 ++++++++++++++++++ .../java/LinkedList/SingleLinkedListExam.java | 24 +++ 2 files changed, 199 insertions(+) create mode 100644 src/dataANDcalc/java/LinkedList/DoubleLinkedList.java create mode 100644 src/dataANDcalc/java/LinkedList/SingleLinkedListExam.java diff --git a/src/dataANDcalc/java/LinkedList/DoubleLinkedList.java b/src/dataANDcalc/java/LinkedList/DoubleLinkedList.java new file mode 100644 index 0000000..0e4de46 --- /dev/null +++ b/src/dataANDcalc/java/LinkedList/DoubleLinkedList.java @@ -0,0 +1,175 @@ +package LinkedList; + +import java.util.Scanner; + +public class DoubleLinkedList { + + private DoubleLinkedList.DoubleLinkedListNode head = new DoubleLinkedList.DoubleLinkedListNode(0, 0); + + public void add(DoubleLinkedListNode node){ + DoubleLinkedListNode temp = head; + while (true) { + if (temp.next == null){ + break; + } + temp = temp.next; + } + temp.next = node; + node.prev = temp; + } + + public void modify(DoubleLinkedListNode node){ + DoubleLinkedListNode temp = head; + if (head.next == null){ + System.out.println("链表为空"); + return; + } + while (true) { + temp = temp.next; + if (temp == null){ + System.out.println("未找到更新的数据"); + return; + } + if (temp.nodeId == node.nodeId){ + temp.data = node.data; + System.out.println("数据更新成功"); + return; + } + } + } + + public void delete(int nodeId){ + DoubleLinkedListNode temp = head.next; + if (temp == null){ + System.out.println("链表为空"); + return; + } + while (true) { + if (temp == null){ + System.out.println("未找到需要删除的节点"); + return; + } + if (temp.nodeId == nodeId){ + if (temp.next == null){ + temp.prev.next = null; + return; + } + temp.next.prev = temp.prev; + temp.prev.next = temp.next; + return; + } + temp = temp.next; + } + } + + private void show(){ + DoubleLinkedListNode temp = head; + if (head.next == null){ + System.out.println("当前双向链表为空"); + } + while(true){ + if (temp.next == null){ + break; + } + temp = temp.next; + System.out.println(temp.print()); + } + } + + public static void main(String[] args) { + DoubleLinkedList doubleLinkedList = new DoubleLinkedList(); + Scanner scan = new Scanner(System.in); + while (true) { + System.out.println("a添加节点, s查看节点, r按顺序加入, u更新数据, d删除数据 exit退出:"); + String handle = scan.next(); + if ("exit".equals(handle)){ + break; + } + if ("a".equals(handle)){ + System.out.println("请输入节点编号:"); + int no = scan.nextInt(); + System.out.println("请输入节点数据:"); + int data = scan.nextInt(); + DoubleLinkedList.DoubleLinkedListNode node = new DoubleLinkedList.DoubleLinkedListNode(no,data); + doubleLinkedList.add(node); + } + if ("r".equals(handle)){ + System.out.println("请输入节点编号:"); + int no = scan.nextInt(); + System.out.println("请输入节点数据:"); + int data = scan.nextInt(); + DoubleLinkedList.DoubleLinkedListNode node = new DoubleLinkedList.DoubleLinkedListNode(no,data); + } + if ("s".equals(handle)){ + doubleLinkedList.show(); + } + if ("u".equals(handle)){ + System.out.println("请输入更新节点编号:"); + int no = scan.nextInt(); + System.out.println("请输入更新节点数据:"); + int data = scan.nextInt(); + DoubleLinkedList.DoubleLinkedListNode node = new DoubleLinkedList.DoubleLinkedListNode(no,data); + doubleLinkedList.modify(node); + } + if ("d".equals(handle)){ + System.out.println("请输入删除节点编号:"); + int no = scan.nextInt(); + doubleLinkedList.delete(no); + } + } + scan.close(); + } + + public static class DoubleLinkedListNode{ + private int nodeId; + private int data; + private DoubleLinkedListNode next; + private DoubleLinkedListNode prev; + + public DoubleLinkedListNode(int nodeId, int data){ + this.nodeId = nodeId; + this.data = data; + } + + public int getNodeId() { + return nodeId; + } + + public void setNodeId(int nodeId) { + this.nodeId = nodeId; + } + + public int getData() { + return data; + } + + public void setData(int data) { + this.data = data; + } + + public DoubleLinkedListNode getNext() { + return next; + } + + public void setNext(DoubleLinkedListNode next) { + this.next = next; + } + + public DoubleLinkedListNode getPrev() { + return prev; + } + + public void setPrev(DoubleLinkedListNode prev) { + this.prev = prev; + } + + public String print() { + return "DoubleLinkedListNode{" + + "nodeId=" + nodeId + + ", data=" + data + + ", next=" + (next == null ? "null" : String.valueOf(next.nodeId)) + + ", prev=" + (prev == null ? "null" : String.valueOf(prev.nodeId)) + + '}'; + } + } +} diff --git a/src/dataANDcalc/java/LinkedList/SingleLinkedListExam.java b/src/dataANDcalc/java/LinkedList/SingleLinkedListExam.java new file mode 100644 index 0000000..64a854c --- /dev/null +++ b/src/dataANDcalc/java/LinkedList/SingleLinkedListExam.java @@ -0,0 +1,24 @@ +package LinkedList; + +public class SingleLinkedListExam { + + // 1.求单向列表中有效节点的个数 + + // 2.查找单向链表中倒数第k个节点 + /* + 1.统计链表的长度 + 2.根据长度减去k得到实际需要遍历的长度 + 3.根据实际需要遍历的长度获取节点 + */ + + // 3.单向链表的反转 + /* + 1.先定义一个新的头节点 + 2.从头到尾遍历原来的链表,每遍历一个节点,就将其放到新的链表的最前端 + 3.将原来的链表头指向新的链表 + */ + + // 4.从尾到头打印单向链表 + + // 5.合并两个有序的单向链表,合并之后链表仍然有顺序 +}