diff --git a/Main.java b/Main.java index 057428817fa315cf419ab3ea8cc74615dbf94f39..01e54d2ca17bb7abc0b0d0342c80daa332bb6348 100644 --- a/Main.java +++ b/Main.java @@ -1,10 +1,64 @@ +import TopicOne.OneLinkedList; +import TopicThree.ThreeLinkedList; +import TopicTwo.TowLinkedList; + class Main { - public static void main(String[] args) { - LinkedList ll = new LinkedList(); - ll.addToFront(1); - ll.addToFront(2); - ll.addToRear(3); - ll.print(); - - } + public static void main(String[] args) { + System.out.println("****************************************************"); + System.out.println("1.用你擅长的语言实现链表"); + OneLinkedList oneLinkedList = new OneLinkedList(); + oneLinkedList.printItems(); + oneLinkedList.addToFront("1"); + oneLinkedList.addToFront("2"); + oneLinkedList.printItems(); + oneLinkedList.addToRear("3"); + oneLinkedList.addToRear("4"); + oneLinkedList.printItems(); + boolean itemExist = oneLinkedList.findItem("3"); + System.out.println(itemExist ? "节点存在" : "节点不存在"); + System.out.println("链表长度为" + oneLinkedList.size()); + oneLinkedList.printItems(); + oneLinkedList.deleteItems("2"); + oneLinkedList.printItems(); + oneLinkedList.deleteItems("4"); + oneLinkedList.printItems(); + oneLinkedList.deleteItems("5"); + oneLinkedList.printItems(); + System.out.println("****************************************************"); + System.out.println("2.实现带尾指针的链表"); + TowLinkedList towLinkedList = new TowLinkedList<>(); + towLinkedList.addToFront("1"); + towLinkedList.addToFront("2"); + towLinkedList.addToRear("3"); + towLinkedList.addToRear("4"); + towLinkedList.printItems(); + boolean itemExist1 = towLinkedList.findItem("3"); + System.out.println(itemExist1 ? "节点存在" : "节点不存在"); + itemExist1 = towLinkedList.findItem("5"); + System.out.println(itemExist1 ? "节点存在" : "节点不存在"); + System.out.println("链表长度为" + towLinkedList.size()); + towLinkedList.printItems(); + towLinkedList.deleteItems("2"); + towLinkedList.printItems(); + towLinkedList.deleteItems("4");//测试删除尾结点 + towLinkedList.printItems(); + towLinkedList.addToRear("4"); + towLinkedList.printItems(); + towLinkedList.deleteItems("5"); + towLinkedList.printItems(); + System.out.println("****************************************************"); + System.out.println("3.实现双向链表"); + ThreeLinkedList threeLinkedList = new ThreeLinkedList<>(); + threeLinkedList.addToFront("1"); + threeLinkedList.addToFront("2"); + threeLinkedList.addToRear("3"); + threeLinkedList.addToRear("5"); + threeLinkedList.printItems(); + threeLinkedList.deleteItems("5"); + threeLinkedList.printItems(); + threeLinkedList.deleteItems("5"); + threeLinkedList.printItems(); + + + } } \ No newline at end of file diff --git a/TopicOne/Node.java b/TopicOne/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..4515e6bb64f690418ffa90986f851fa124a268c4 --- /dev/null +++ b/TopicOne/Node.java @@ -0,0 +1,10 @@ +package TopicOne; + +public class Node { + E item; + Node next = null; + + Node(E item) { + this.item = item; + } +} \ No newline at end of file diff --git a/TopicOne/OneLinkedList.java b/TopicOne/OneLinkedList.java new file mode 100644 index 0000000000000000000000000000000000000000..64c3dc490fde5a37fd9b6373ae43129bcbeb4f3e --- /dev/null +++ b/TopicOne/OneLinkedList.java @@ -0,0 +1,102 @@ +package TopicOne; + +public class OneLinkedList { + + private Node head; + + public OneLinkedList() { + 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 { + Node temp = head; + while (temp.next != null) { + temp = temp.next; + } + temp.next = node; + } + } + + // 打印所有节点 + public void printItems() { + if (head != null) { + String nodeListStr = ""; + Node 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; + } + Node preNode = head; + Node curNode = head.next; + while (curNode != null) { + //这里全当字符串处理 + String itemStr = (String) curNode.item; + if (itemStr.equals(value)) { + //内容相同进行删除 结束循环 + preNode.next= curNode.next; + return; + } + preNode=preNode.next; + curNode=preNode.next; + } + System.out.println("无此节点,删除失败"); + } else { + System.out.println("链表为空,无法进行删除操作"); + } + } + + //判断节点是否存在 + public boolean findItem(E value) { + Node 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; + Node temp = head; + while (temp != null) { + linkedListLength++; + temp = temp.next; + } + return linkedListLength; + } + +} diff --git a/TopicThree/Node.java b/TopicThree/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..7161e212e4f5e972de55ed8d88ec700f64a71a61 --- /dev/null +++ b/TopicThree/Node.java @@ -0,0 +1,11 @@ +package TopicThree; + +public class Node { + E item; + Node prev = null; + Node next = null; + + Node(E item) { + this.item = item; + } +} \ No newline at end of file diff --git a/TopicThree/ThreeLinkedList.java b/TopicThree/ThreeLinkedList.java new file mode 100644 index 0000000000000000000000000000000000000000..90769e6e68e8d71448babafb0302ef6cf5c2717f --- /dev/null +++ b/TopicThree/ThreeLinkedList.java @@ -0,0 +1,86 @@ +package TopicThree; + +public class ThreeLinkedList { + + private Node head, tail; + + public ThreeLinkedList() { + this.head = null; + this.tail = null; + } + + public void addToFront(E item) { + Node node = new Node<>(item); + if (head == null) { + tail = node; + } else { + head.prev = node; + node.next = head; + } + head = node; + } + + public void addToRear(E item) { + Node node = new Node<>(item); + if (head == null) { + head = node; + } else { + tail.next = node; + node.prev = tail; + } + tail = node; + } + + //删除节点 前提元素不重复 + public void deleteItems(E value) { + Node node = head; + String itemStr = (String) node.item; + while (!itemStr.equals(value)) { + if (node.next == null) { + System.out.println("找不到节点"); + return; + } + node = node.next; + itemStr = (String) node.item; + } + if (node == head) { + head = head.next; + } else { + node.prev.next = node.next; + } + } + + + //判断节点是否存在 + public boolean findItem(E value) { + Node temp = head; + while (temp != null) { + //这里全当字符串处理 + String itemStr = (String) temp.item; + if (itemStr.equals(value)) { + //内容相同节点存在结束循环 + return true; + } + temp = temp.next; + } + return false; + } + + + // 打印所有节点 + public void printItems() { + if (head != null) { + String nodeListStr = ""; + Node temp = head; + while (temp != null) { + nodeListStr += (temp.item + "->"); + temp = temp.next; + } + System.out.println(nodeListStr); + } else { + System.out.println("空链表"); + } + } + +} + diff --git a/TopicTwo/Node.java b/TopicTwo/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..fb6bdccc1aed5bb88e686587b5ed0ee28a9cb073 --- /dev/null +++ b/TopicTwo/Node.java @@ -0,0 +1,10 @@ +package TopicTwo; + +public class Node { + E item; + Node next = null; + + Node(E item) { + this.item = item; + } +} \ No newline at end of file diff --git a/TopicTwo/TowLinkedList.java b/TopicTwo/TowLinkedList.java new file mode 100644 index 0000000000000000000000000000000000000000..6e20c87cfe5c3e134c1e323ce95bfaeacce07972 --- /dev/null +++ b/TopicTwo/TowLinkedList.java @@ -0,0 +1,107 @@ +package TopicTwo; + + +public class TowLinkedList { + private Node head, tail; + + public TowLinkedList() { + this.head = null; + this.tail = null; + } + + //添加到头部 + public void addToFront(E value) { + 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 = ""; + Node 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; + } + Node preNode = head; + Node 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) { + Node 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; + Node temp = head; + while (temp != null) { + linkedListLength++; + temp = temp.next; + } + return linkedListLength; + } + +}