diff --git a/LinkedList.java b/LinkedList.java index 7836598c18ca0b770825087dc2deff812a699ec6..fa04bc82dd8d619c84cc92a4cf7923073fe5dea4 100644 --- a/LinkedList.java +++ b/LinkedList.java @@ -2,43 +2,98 @@ public class LinkedList { private Node head; public LinkedList() { - head = null; + this.head = null; } - public void addToFront(E item) { - Node node = new Node(item); + //添加到头部 + public void addToFront(E value) { + Node node = new Node<>(value); + if (head != null) { + node.next = head; + } + head = node; + } - if (this.head == null) { - this.head = node; - } else{ - Node temp = head; - this.head = node; - this.head.next = temp; + //添加到最后 + public void addToRear(E value) { + Node node = new Node<>(value); + if (head == null) { + head = node; + } else { + var temp = head; + while (temp.next != null) { + temp = temp.next; + } + temp.next = node; } } + // 打印所有节点 + public void printItems() { + if (head != null) { + StringBuilder nodeListStr = new StringBuilder(); + var temp = head; + while (temp != null) { + nodeListStr.append(temp.item).append(" "); + temp = temp.next; + } + System.out.println(nodeListStr); + } else { + System.out.println("空链表"); + } + } + + //删除节点 前提元素不重复 + public void deleteItems(E value) { + if (head != null) { + String headStr = (String) head.item; + if (headStr.equals(value)){ + head= head.next; + return; + } + var preNode = head; + var curNode = head.next; + while (curNode != null) { + //这里全当字符串处理 + String itemStr = (String) curNode.item; + if (itemStr.equals(value)) { + //内容相同进行删除 结束循环 + preNode.next= curNode.next; + break; + } + preNode=preNode.next; + curNode=preNode.next; + } - public void addToRear(E item) { - Node newNode = new Node(item); - if (this.head == null) { - this.head = newNode; } else { - - Node temp = this.head; - while(temp.next != null){ - temp = temp.next; + System.out.println("链表为空,无法进行删除操作"); + } + } + + //判断节点是否存在 + public boolean findItem(E value) { + var temp = head; + while (temp != null) { + //这里全当字符串处理 + String itemStr = (String) temp.item; + if (itemStr.equals(value)) { + //内容相同节点存在结束循环 + return true; } - temp.next = newNode; + temp = temp.next; } + return false; } - public void print() { - Node temp = this.head; - while(temp.next != null){ - System.out.print(temp.item + " -> "); + //计算链表长度数值 + public int size() { + int linkedListLength = 0; + var temp = head; + while (temp != null) { + linkedListLength++; temp = temp.next; } - System.out.println(temp.item); + return linkedListLength; } -} +} \ No newline at end of file diff --git a/Main.java b/Main.java index 057428817fa315cf419ab3ea8cc74615dbf94f39..e287ed4a84d7c563553cdc42ca53bf9e92267e38 100644 --- a/Main.java +++ b/Main.java @@ -1,10 +1,19 @@ class Main { public static void main(String[] args) { - LinkedList ll = new LinkedList(); - ll.addToFront(1); - ll.addToFront(2); - ll.addToRear(3); - ll.print(); - + var ll = new LinkedList(); + ll.printItems(); + ll.addToFront("3"); + ll.addToFront("5"); + ll.printItems(); + ll.addToRear("7"); + ll.addToRear("2"); + ll.printItems(); + boolean itemExist = ll.findItem("6"); + System.out.println(itemExist ? "节点存在" : "节点不存在"); + System.out.println("链表长度为" + ll.size()); + ll.printItems(); + ll.deleteItems("1"); + ll.deleteItems("9"); + ll.printItems(); } } \ No newline at end of file diff --git a/Node.java b/Node.java index ed7a3524e3c608d2a479f484e240452ad34c5a51..fe64454a80aa32af96561d01573a106861693888 100644 --- a/Node.java +++ b/Node.java @@ -1,6 +1,6 @@ public class Node { E item; - Node next = null; + Node next = null; Node(E item) { this.item = item; diff --git a/lianbiao1/LinkedList1.java b/lianbiao1/LinkedList1.java new file mode 100644 index 0000000000000000000000000000000000000000..04d63167bf94f1f167e4b4edeaae7cb81f161d0b --- /dev/null +++ b/lianbiao1/LinkedList1.java @@ -0,0 +1,101 @@ +package lianbiao1; + +public class LinkedList1 { + private Node head; + + public LinkedList1() { + this.head = null; + } + + //添加到头部 + public void addToFront(E value) { + Node node = new Node<>(value); + if (head != null) { + node.next = head; + } + head = node; + } + + //添加到最后 + public void addToRear(E value) { + Node node = new Node<>(value); + if (head == null) { + head = node; + } else { + var temp = head; + while (temp.next != null) { + temp = temp.next; + } + temp.next = node; + } + } + + // 打印所有节点 + public void printItems() { + if (head != null) { + StringBuilder nodeListStr = new StringBuilder(); + var temp = head; + while (temp != null) { + nodeListStr.append(temp.item).append(" "); + temp = temp.next; + } + System.out.println(nodeListStr); + } else { + System.out.println("链表为空"); + } + } + + //删除节点 前提元素不重复 + public void deleteItems(E value) { + if (head != null) { + String headStr = (String) head.item; + if (headStr.equals(value)){ + head= head.next; + return; + } + var preNode = head; + var curNode = head.next; + while (curNode != null) { + //这里全当字符串处理 + String itemStr = (String) curNode.item; + if (itemStr.equals(value)) { + //内容相同进行删除 结束循环 + preNode.next= curNode.next; + break; + } + preNode=preNode.next; + curNode=preNode.next; + } + + } else { + System.out.println("链表为空,无法删除操作"); + } + } + + //判断节点是否存在 + public boolean findItem(E value) { + var temp = head; + while (temp != null) { + //这里全当字符串处理 + String itemStr = (String) temp.item; + if (itemStr.equals(value)) { + //内容相同节点存在结束循环 + return true; + } + temp = temp.next; + } + return false; + } + + //计算链表长度数值 + public int size() { + int linkedListLength = 0; + var temp = head; + while (temp != null) { + linkedListLength++; + temp = temp.next; + } + return linkedListLength; + } + +} \ No newline at end of file diff --git a/lianbiao1/Main.java b/lianbiao1/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..bb5ef75eab362cb10c56eb3a785be51a1d13f2fb --- /dev/null +++ b/lianbiao1/Main.java @@ -0,0 +1,21 @@ +package lianbiao1; + +class Main { + public static void main(String[] args) { + var ll = new LinkedList1(); + ll.printItems(); + ll.addToFront("3"); + ll.addToFront("5"); + ll.printItems(); + ll.addToRear("7"); + ll.addToRear("2"); + ll.printItems(); + boolean itemExist = ll.findItem("6"); + System.out.println(itemExist ? "节点存在" : "节点不存在"); + System.out.println("链表长度为" + ll.size()); + ll.printItems(); + ll.deleteItems("1"); + ll.deleteItems("9"); + ll.printItems(); + } +} \ No newline at end of file diff --git a/lianbiao1/Node.java b/lianbiao1/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..f36357814518deb33a8e7573d8d976772255b287 --- /dev/null +++ b/lianbiao1/Node.java @@ -0,0 +1,10 @@ +package lianbiao1; + +public class Node { + E item; + Node next = null; + + Node(E item) { + this.item = item; + } +} \ No newline at end of file diff --git a/lianbiao2jianwei/LinkedList2.java b/lianbiao2jianwei/LinkedList2.java new file mode 100644 index 0000000000000000000000000000000000000000..c570ba5ed625164b0faea955bdb88b8b1df32201 --- /dev/null +++ b/lianbiao2jianwei/LinkedList2.java @@ -0,0 +1,109 @@ +package lianbiao2jianwei; + +public class LinkedList2 { + private Node head; + private Node tail; + + public LinkedList2() { + this.head = null; + this.tail = null; + } + + //添加到头部 + public void addToFront(E value) { + Node node = new Node<>(value); + if (head == null) { + head = node; + tail = head; + } else { + node.next = head; + head = node; + } + } + + //添加到最后 + public void addToRear(E value) { + Node node = new Node<>(value); + if (tail == null) { + tail = node; + head = tail; + } else { + tail.next = node; + tail = tail.next; + } + } + + // 打印所有节点 + public void printItems() { + if (head != null) { + String nodeListStr = ""; + var temp = head; + while (temp != null) { + nodeListStr += (temp.item + "->"); + temp = temp.next; + } + System.out.println(nodeListStr); + } else { + System.out.println("链表为空"); + } + } + + //删除节点 前提元素不重复 + public void deleteItems(E value) { + if (head != null) { + String headStr = (String) head.item; + if (headStr.equals(value)) { + head = head.next; + return; + } + var preNode = head; + var curNode = head.next; + while (curNode != null) { + //这里全当字符串处理 + String itemStr = (String) curNode.item; + if (itemStr.equals(value)) { + if (curNode.next == null) { + //删除最后一项 + //移动尾指针 + tail = preNode; + } + //内容相同进行删除 结束循环 + preNode.next = curNode.next; + return; + } + preNode = preNode.next; + curNode = preNode.next; + } + System.out.println("无此节点,删除失败"); + } else { + System.out.println("链表为空,无法删除操作"); + } + } + + //判断节点是否存在 + public boolean findItem(E value) { + var temp = head; + while (temp != null) { + //这里全当字符串处理 + String itemStr = (String) temp.item; + if (itemStr.equals(value)) { + //内容相同节点存在结束循环 + return true; + } + temp = temp.next; + } + return false; + } + + //计算链表长度数值 + public int size() { + int linkedListLength = 0; + var temp = head; + while (temp != null) { + linkedListLength++; + temp = temp.next; + } + return linkedListLength; + } + +} \ No newline at end of file diff --git a/lianbiao2jianwei/Main.java b/lianbiao2jianwei/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..52b8d85bbd55a648b4a4237e852468905716f959 --- /dev/null +++ b/lianbiao2jianwei/Main.java @@ -0,0 +1,45 @@ +package lianbiao2jianwei; + +class Main { + public static void main(String[] args) { + //var ll = new LinkedList2(); + // ll.printItems(); + // ll.addToFront("3"); + //ll.addToFront("5"); + // ll.printItems(); + // ll.addToRear("7"); + // ll.addToRear("2"); + // ll.printItems(); + // boolean itemExist = ll.findItem("6"); + // System.out.println(itemExist ? "节点存在" : "节点不存在"); + //System.out.println("链表长度为" + ll.size()); + // ll.printItems(); + // ll.deleteItems("1"); + //ll.deleteItems("9"); + // ll.printItems(); + System.out.println("****************************************************"); + System.out.println("2.实现带尾指针的链表"); + var ll = new LinkedList2(); + ll.addToFront("1"); + ll.addToFront("2"); + ll.addToRear("3"); + ll.addToRear("4"); + ll.printItems(); + boolean itemExist1 = ll.findItem("3"); + System.out.println(itemExist1 ? "节点存在" : "节点不存在"); + itemExist1 = ll.findItem("5"); + System.out.println(itemExist1 ? "节点存在" : "节点不存在"); + System.out.println("链表长度为" + ll.size()); + ll.printItems(); + ll.deleteItems("2"); + ll.printItems(); + ll.deleteItems("4");//测试删除尾结点 + ll.printItems(); + ll.addToRear("4"); + ll.printItems(); + ll.deleteItems("5"); + ll.printItems(); + System.out.println("****************************************************"); + System.out.println("3.实现双向链表"); + } +} \ No newline at end of file diff --git a/lianbiao2jianwei/Node.java b/lianbiao2jianwei/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..0eb42c28dc06671dadfa702ac70a194c10418e37 --- /dev/null +++ b/lianbiao2jianwei/Node.java @@ -0,0 +1,10 @@ +package lianbiao2jianwei; + +public class Node { + E item; + Node next = null; + + Node(E item) { + this.item = item; + } +} \ No newline at end of file diff --git a/lianbiao3shuangxiang/LinkedList3.java b/lianbiao3shuangxiang/LinkedList3.java new file mode 100644 index 0000000000000000000000000000000000000000..39c122b588c1f644377f77c0ab7b24c99a2b9f05 --- /dev/null +++ b/lianbiao3shuangxiang/LinkedList3.java @@ -0,0 +1,108 @@ +package lianbiao3shuangxiang; + +public class LinkedList3 { + private Node head; + private Node tail; + + public LinkedList3() { + this.head = null; + this.tail = null; + } + + //添加到头部 + public void addToFront(E value) { + Node node; + node = new Node<>(value); + if (head == null) { + tail = node; + } else { + node.next = head; + } + head = node; + } + + //添加到最后 + public void addToRear(E value) { + Node node = new Node<>(value); + if (head == null) { + head = node; + } else { + tail.next = node; + } + tail = node; + } + + // 打印所有节点 + public void printItems() { + if (head != null) { + String nodeListStr = ""; + var temp = head; + while (temp != null) { + nodeListStr += (temp.item + "->"); + temp = temp.next; + } + System.out.println(nodeListStr); + } else { + System.out.println("链表为空"); + } + } + + //删除节点 前提元素不重复 + public void deleteItems(E value) { + if (head != null) { + String headStr = (String) head.item; + if (headStr.equals(value)) { + head = head.next; + return; + } + var preNode = head; + var curNode = head.next; + while (curNode != null) { + //这里全当字符串处理 + String itemStr = (String) curNode.item; + if (itemStr.equals(value)) { + if (curNode.next == null) { + //删除最后一项 + //移动尾指针 + tail = preNode; + } + //内容相同进行删除 结束循环 + preNode.next = curNode.next; + return; + } + preNode = preNode.next; + curNode = preNode.next; + } + System.out.println("无此节点,删除失败"); + } else { + System.out.println("链表为空,无法删除操作"); + } + } + + //判断节点是否存在 + public boolean findItem(E value) { + var temp = head; + while (temp != null) { + //这里全当字符串处理 + String itemStr = (String) temp.item; + if (itemStr.equals(value)) { + //内容相同节点存在结束循环 + return true; + } + temp = temp.next; + } + return false; + } + + //计算链表长度数值 + public int size() { + int linkedListLength = 0; + var temp = head; + while (temp != null) { + linkedListLength++; + temp = temp.next; + } + return linkedListLength; + } + +} diff --git a/lianbiao3shuangxiang/Main.java b/lianbiao3shuangxiang/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..58521ec3a1a5b891487da7e988936d8b34d9635c --- /dev/null +++ b/lianbiao3shuangxiang/Main.java @@ -0,0 +1,45 @@ +package lianbiao3shuangxiang; + +class Main { + public static void main(String[] args) { + //var ll = new LinkedList2(); + // ll.printItems(); + // ll.addToFront("3"); + //ll.addToFront("5"); + // ll.printItems(); + // ll.addToRear("7"); + // ll.addToRear("2"); + // ll.printItems(); + // boolean itemExist = ll.findItem("6"); + // System.out.println(itemExist ? "节点存在" : "节点不存在"); + //System.out.println("链表长度为" + ll.size()); + // ll.printItems(); + // ll.deleteItems("1"); + //ll.deleteItems("9"); + // ll.printItems(); + System.out.println("****************************************************"); + System.out.println("2.实现带尾指针的链表"); + var ll = new LinkedList3(); + ll.addToFront("1"); + ll.addToFront("2"); + ll.addToRear("3"); + ll.addToRear("4"); + ll.printItems(); + boolean itemExist1 = ll.findItem("3"); + System.out.println(itemExist1 ? "节点存在" : "节点不存在"); + itemExist1 = ll.findItem("5"); + System.out.println(itemExist1 ? "节点存在" : "节点不存在"); + System.out.println("链表长度为" + ll.size()); + ll.printItems(); + ll.deleteItems("2"); + ll.printItems(); + ll.deleteItems("4");//测试删除尾结点 + ll.printItems(); + ll.addToRear("4"); + ll.printItems(); + ll.deleteItems("5"); + ll.printItems(); + System.out.println("****************************************************"); + System.out.println("3.实现双向链表"); + } +} \ No newline at end of file diff --git a/lianbiao3shuangxiang/Node.java b/lianbiao3shuangxiang/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..d5a1103c3ba28c546f6ef465ffcf600f6904635b --- /dev/null +++ b/lianbiao3shuangxiang/Node.java @@ -0,0 +1,10 @@ +package lianbiao3shuangxiang; + +public class Node { + E item; + Node next = null; + + Node(E item) { + this.item = item; + } +} \ No newline at end of file