2025-01-12 双向链表
This commit is contained in:
parent
0ade829dfa
commit
ec1aea6fe8
175
src/dataANDcalc/java/LinkedList/DoubleLinkedList.java
Normal file
175
src/dataANDcalc/java/LinkedList/DoubleLinkedList.java
Normal 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)) +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
}
|
24
src/dataANDcalc/java/LinkedList/SingleLinkedListExam.java
Normal file
24
src/dataANDcalc/java/LinkedList/SingleLinkedListExam.java
Normal file
@ -0,0 +1,24 @@
|
||||
package LinkedList;
|
||||
|
||||
public class SingleLinkedListExam {
|
||||
|
||||
// 1.求单向列表中有效节点的个数
|
||||
|
||||
// 2.查找单向链表中倒数第k个节点
|
||||
/*
|
||||
1.统计链表的长度
|
||||
2.根据长度减去k得到实际需要遍历的长度
|
||||
3.根据实际需要遍历的长度获取节点
|
||||
*/
|
||||
|
||||
// 3.单向链表的反转
|
||||
/*
|
||||
1.先定义一个新的头节点
|
||||
2.从头到尾遍历原来的链表,每遍历一个节点,就将其放到新的链表的最前端
|
||||
3.将原来的链表头指向新的链表
|
||||
*/
|
||||
|
||||
// 4.从尾到头打印单向链表
|
||||
|
||||
// 5.合并两个有序的单向链表,合并之后链表仍然有顺序
|
||||
}
|
Loading…
Reference in New Issue
Block a user