diff --git a/.gitignore b/.gitignore index d160a7b219f7fd0ea93ad4761fc8bf451476c7f0..58306adb45fbb76ecdb9f38ca85b4b80392e9392 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ package.json package-lock.json node_modules id.txt + + +.idea/ \ No newline at end of file diff --git a/LinkedList.java b/LinkedList.java deleted file mode 100644 index 7836598c18ca0b770825087dc2deff812a699ec6..0000000000000000000000000000000000000000 --- a/LinkedList.java +++ /dev/null @@ -1,44 +0,0 @@ -public class LinkedList { - private Node head; - - public LinkedList() { - head = null; - } - - public void addToFront(E item) { - Node node = new Node(item); - - if (this.head == null) { - this.head = node; - } else{ - Node temp = head; - this.head = node; - this.head.next = temp; - } - } - - - 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; - } - temp.next = newNode; - } - } - - public void print() { - Node temp = this.head; - while(temp.next != null){ - System.out.print(temp.item + " -> "); - temp = temp.next; - } - System.out.println(temp.item); - } -} - diff --git a/Main.java b/Main.java deleted file mode 100644 index 057428817fa315cf419ab3ea8cc74615dbf94f39..0000000000000000000000000000000000000000 --- a/Main.java +++ /dev/null @@ -1,10 +0,0 @@ -class Main { - public static void main(String[] args) { - LinkedList ll = new LinkedList(); - ll.addToFront(1); - ll.addToFront(2); - ll.addToRear(3); - ll.print(); - - } -} \ No newline at end of file diff --git a/Node.java b/Node.java deleted file mode 100644 index ed7a3524e3c608d2a479f484e240452ad34c5a51..0000000000000000000000000000000000000000 --- a/Node.java +++ /dev/null @@ -1,8 +0,0 @@ -public class Node { - E item; - Node next = null; - - Node(E item) { - this.item = item; - } -} \ No newline at end of file diff --git a/src/com/longyuan/hjb/Test.java b/src/com/longyuan/hjb/Test.java new file mode 100644 index 0000000000000000000000000000000000000000..1b3c67cea335efdca25eaa4376206f74b59cddc8 --- /dev/null +++ b/src/com/longyuan/hjb/Test.java @@ -0,0 +1,61 @@ +package com.longyuan.hjb; + + +import com.longyuan.hjb.domain.MyLinkedList; +import com.longyuan.hjb.domain.Node; + +public class Test { + public static void main(String[] args) { + + MyLinkedList myLinkedList = new MyLinkedList(); + myLinkedList.addNodeToFront("a"); + myLinkedList.addNodeToRear("c"); + myLinkedList.addNodeToFront("c"); + myLinkedList.addNodeToRear("d"); + System.out.println(myLinkedList.getSize()); + myLinkedList.foreach(); + + //测试双向链表反转 + myLinkedList.linkedListReverse(); + myLinkedList.foreach(); + System.out.println(myLinkedList.getFirst().getNext().getNext().getNext().getData()); + + //测试两个链表合并 + MyLinkedList myLinkedList1 = new MyLinkedList(); + myLinkedList1.addNodeToRear("a"); + myLinkedList1.addNodeToFront("b"); + myLinkedList1.addNodeToRear("c"); + myLinkedList1.foreach(); + myLinkedList.addLinkedToFront(myLinkedList1); + myLinkedList.foreach(); + MyLinkedList myLinkedList2 = new MyLinkedList(); + myLinkedList2.addNodeToRear("e"); + myLinkedList2.addNodeToFront("f"); + myLinkedList2.addNodeToRear("g"); + myLinkedList2.foreach(); + myLinkedList.addLinkedToRear(myLinkedList2); + myLinkedList.foreach(); + + // 测试删除双向链表倒数第 n 个结点 + myLinkedList.removeToRear(4); + myLinkedList.foreach(); + System.out.println(myLinkedList.getSize()); + + // 测试链表的中间节点 + Node nodeByMiddle = myLinkedList.getNodeByMiddle(); + System.out.println(nodeByMiddle.getData()); + + // 测试LRU 缓存淘汰算法的链表实现 + Node four = myLinkedList.getNodeToFront(4); + System.out.println(four.getData()); + myLinkedList.foreach(); + myLinkedList.addNodeToFront("t"); + myLinkedList.foreach(); + myLinkedList.addNodeToFront("t"); + myLinkedList.foreach(); + myLinkedList.linkedListReverse(); + System.out.println(myLinkedList.getSize()); + myLinkedList.foreach(); + + } +} diff --git a/src/com/longyuan/hjb/domain/MyLinkedList.java b/src/com/longyuan/hjb/domain/MyLinkedList.java new file mode 100644 index 0000000000000000000000000000000000000000..2a46d63690ede1545224a1ae645efefdd2d1df26 --- /dev/null +++ b/src/com/longyuan/hjb/domain/MyLinkedList.java @@ -0,0 +1,202 @@ +package com.longyuan.hjb.domain; + +public class MyLinkedList { + private int size; + private Node first; + private Node end; + + public void setSize(int size) { + this.size = size; + } + + public Node getEnd() { + return end; + } + + public void setEnd(Node end) { + this.end = end; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Node getFirst() { + return first; + } + + public void setFirst(Node first) { + this.first = first; + } + + //遍历链表 + public void foreach() { + Node temp = first; + while (temp.getNext() != null) { + System.out.print(temp.getData() + " "); + temp = temp.getNext(); + } + //输出最后一个节点 + System.out.println(temp.getData()); + } + /*从前面增加节点*/ + public void addNodeToFront(String data) { + //如果链表长度=10 移除最后一个元素 + if (size == 10) { + removeToRear(1); + } + Node newNode = new Node(); + newNode.setData(data); + //链表为空时 + if (size == 0) { + first = end = newNode; + size++; + return; + } + //设置新加入节点的右指针 + newNode.setNext(first); + //设置第一个节点的左指针为新加入的节点 + first.setPrevious(newNode); + //设置加入的节点为头结点 + first = newNode; + size++; + } + /*从后面增加节点*/ + public void addNodeToRear(String data) { + Node newNode = new Node(); + newNode.setData(data); + //判断是否是空链表 + if (size == 0) { + first = newNode; + end = newNode; + size++; + return; + } + //非空链表 + Node temp = first; + while (temp.getNext() != null) { + temp = temp.getNext(); + } + //设置最后一个节点为新加入的节点 + temp.setNext(newNode); + newNode.setPrevious(temp); + end = newNode; + size++; + } + //双向链表反转 + /*public void linkedListReverse() { + MyLinkedList myLinkedList = new MyLinkedList(); + Node base = end; + Node to = myLinkedList.getFirst(); + to.setData(base.getData()); + while (base.getPrevious() != null) { + base = base.getPrevious(); + Node temp = new Node(); + temp.setData(base.getData()); + to.setNext(temp); + Node tes = to; + to = to.getNext(); + to.setPrevious(tes); + } + myLinkedList.setEnd(to); + myLinkedList.getEnd().setNext(null); + myLinkedList.getFirst().setPrevious(null); + first = myLinkedList.getFirst(); + end = myLinkedList.getEnd(); + }*/ + public void linkedListReverse() { + MyLinkedList myLinkedList = new MyLinkedList(); + Node wei = end; + myLinkedList.setFirst(end); + Node temp = myLinkedList.getFirst(); + while (wei.getPrevious() != null) { + temp.setNext(wei.getPrevious()); + wei = wei.getPrevious(); + temp = temp.getNext(); + } + myLinkedList.setEnd(wei); + first = myLinkedList.getFirst(); + end = myLinkedList.getEnd(); + first.setPrevious(null); + end.setNext(null); + Node newTou = myLinkedList.getFirst(); + Node pre = null; + while (newTou.getNext() != null) { + pre = newTou; + newTou = newTou.getNext(); + newTou.setPrevious(pre); + } + newTou.setPrevious(pre); + + } + //从前面添加有序链表 + public void addLinkedToFront(MyLinkedList linkedList) { + linkedList.getEnd().setNext(first); + first.setPrevious(linkedList.getEnd()); + first = linkedList.getFirst(); + size += linkedList.getSize(); + } + //从后面添加有序链表 + public void addLinkedToRear(MyLinkedList linkedList) { + linkedList.getFirst().setPrevious(end); + end.setNext(linkedList.getFirst()); + end = linkedList.getEnd(); + size += linkedList.getSize(); + } + //删除倒数第n个节点 + public void removeToRear(Integer index) { + Node temp = end; + //删除是末尾的话 + if (index == 1) { + Node pre = temp.getPrevious(); + pre.setNext(null); + end = pre; + } else { + while (index > 1) { + temp = temp.getPrevious(); + index--; + } + temp.getPrevious().setNext(temp.getNext()); + temp.getNext().setPrevious(temp.getPrevious()); + } + size--; + } + //返回链表的中间节点 + public Node getNodeByMiddle() { + if (size % 2 == 0 ) { + return null; + } + Node middle = first; + int k = size / 2 ; + while (k > 0) { + middle = middle.getNext(); + k--; + } + return middle; + } + //从前面获取第n个节点 + public Node getNodeToFront(Integer index) { + Node node = first; + while (index > 1) { + node = node.getNext(); + index--; + } + //将获取到节点放到第一个 + Node pre = node.getPrevious(); + pre.setNext(node.getNext()); + node.getNext().setPrevious(pre); + first.setPrevious(node); + node.setPrevious(null); + node.setNext(first); + first = node; + return node; + } + //初始化链表 + public MyLinkedList() { + first = new Node(); + } +} diff --git a/src/com/longyuan/hjb/domain/Node.java b/src/com/longyuan/hjb/domain/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..3ba268cc9f76e4cc95a0cbdf504eef29db2adea1 --- /dev/null +++ b/src/com/longyuan/hjb/domain/Node.java @@ -0,0 +1,30 @@ +package com.longyuan.hjb.domain; + +public class Node { + private String data; + private Node next; + private Node previous; + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Node getNext() { + return next; + } + + public void setNext(Node next) { + this.next = next; + } + + public Node getPrevious() { + return previous; + } + + public void setPrevious(Node previous) { + this.previous = previous; + } +} diff --git "a/\344\275\234\344\270\232\346\217\220\344\272\244\346\265\201\347\250\213.pdf" "b/\344\275\234\344\270\232\346\217\220\344\272\244\346\265\201\347\250\213.pdf" deleted file mode 100644 index c9664d640326aca09bc745b129b70a0d3cb3f62e..0000000000000000000000000000000000000000 Binary files "a/\344\275\234\344\270\232\346\217\220\344\272\244\346\265\201\347\250\213.pdf" and /dev/null differ