2025-01-12 双向链表

This commit is contained in:
liangjinglin 2025-01-12 17:43:18 +08:00
parent 0ade829dfa
commit ec1aea6fe8
2 changed files with 199 additions and 0 deletions

View File

@ -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)) +
'}';
}
}
}

View File

@ -0,0 +1,24 @@
package LinkedList;
public class SingleLinkedListExam {
// 1.求单向列表中有效节点的个数
// 2.查找单向链表中倒数第k个节点
/*
1.统计链表的长度
2.根据长度减去k得到实际需要遍历的长度
3.根据实际需要遍历的长度获取节点
*/
// 3.单向链表的反转
/*
1.先定义一个新的头节点
2.从头到尾遍历原来的链表每遍历一个节点就将其放到新的链表的最前端
3.将原来的链表头指向新的链表
*/
// 4.从尾到头打印单向链表
// 5.合并两个有序的单向链表合并之后链表仍然有顺序
}