From 9b9e9ca04d568960c8490ea3211f1edd031ddf97 Mon Sep 17 00:00:00 2001 From: Leo <582717189@qq.com> Date: Thu, 19 Nov 2020 18:24:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E9=93=BE=E8=A1=A8=E5=8F=8C=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=20=E7=BF=BB=E8=BD=AC=20=E5=88=A0=E9=99=A4=E7=BB=99?= =?UTF-8?q?=E5=AE=9A=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/leo/class02/DeleteGivenValue.java | 297 ++++++++++++++++++++++++++ src/leo/class02/LinkedList.java | 112 +++++++++- 2 files changed, 405 insertions(+), 4 deletions(-) create mode 100644 src/leo/class02/DeleteGivenValue.java diff --git a/src/leo/class02/DeleteGivenValue.java b/src/leo/class02/DeleteGivenValue.java new file mode 100644 index 0000000..4f59f2b --- /dev/null +++ b/src/leo/class02/DeleteGivenValue.java @@ -0,0 +1,297 @@ +package leo.class02; + +/** + * @author Leo + * @ClassName DeleteGivenValue + * @DATE 2020/11/19 2:16 下午 + * @Description 删除给定的值 + */ +public class DeleteGivenValue { + + /** + * 单向链表 + */ + public static class Node{ + int value; + Node next; + + public Node(int value) { + this.value = value; + } + } + + /** + * 双向链表 + */ + public static class DoubleNode{ + int value; + DoubleNode pre; + DoubleNode next; + + public DoubleNode(int value) { + this.value = value; + } + } + + + /** + * 功能描述 : 单链表删除某个给定值 + * @author Leo + * @date 2020/11/19 4:44 下午 + * @param head + * @param value + * @return leo.class02.DeleteGivenValue.Node + */ + public static Node removeNodeOfValue(Node head,int value) { + if (head != null) { + while (head != null) { + if (head.value != value) { + break; + } + head = head.next; + } + } + Node pre = head; + Node cur = head; + while (cur != null) { + if (cur.value == value) { + pre.next = cur.next; + }else { + pre = cur; + } + cur = cur.next; + } + return head; + } + + public static Node removeNodeOfValue1(Node head, int value) { + while (head != null) { + if (head.value != value) { + break; + } + head = head.next; + } + Node cur = head; + Node pre = head; + while (cur != null) { + if (cur.value == value) { + pre.next = cur.next; + } else { + pre = cur; + } + cur = cur.next; + } + return head; + + } + + /** + * 功能描述 : 双链表删除某个给定值 + * @author Leo + * @date 2020/11/19 4:44 下午 + * @param head + * @param value + * @return leo.class02.DeleteGivenValue.DoubleNode + */ + public static DoubleNode removeDoubleNodeOfValue(DoubleNode head, int value) { + while (head != null) { + if (head.value != value) { + break; + } + if (head.next != null) { + head.next.pre = null; + } + head = head.next; + + } + + DoubleNode pre = head; + DoubleNode cur = head; + while (cur != null) { + if (cur.value == value) { + pre.next = cur.next; + if (cur.next != null) { + cur.next.pre = pre; + } + }else{ + pre = cur; + } + cur = cur.next; + } + return head; + } + + public static DoubleNode removeDoubleNodeOfValue1(DoubleNode head, int value) { + while (head != null) { + if (head.value != value) { + break; + } + if (head.next != null) { + head.next.pre = null; + } + head = head.next; + } + DoubleNode cur = head; + DoubleNode pre = head; + while (cur != null) { + if (cur.value == value) { + pre.next = cur.next; + cur.pre = pre; + } else { + pre = cur; + } + cur = cur.next; + } + + return head; + + } + + public static DoubleNode removeDoubleNodeOfValue2(DoubleNode head, int value) { + while (head != null) { + if (head.value != value) { + break; + } + head = head.next; + } + if (head != null) { + head.pre = null; + } + DoubleNode cur = head; + DoubleNode pre = head; + while (cur != null) { + if (cur.value == value) { + pre.next = cur.next; + cur.pre = pre; + }else{ + pre = cur; + } + cur = cur.next; + } + return head; + } + + /** + * 功能描述 : 验证单链表删除结果 + * @author Leo + * @date 2020/11/19 3:38 下午 + * @param head + * @param value + * @return boolean + */ + public static boolean verifyRemoveNodeOfValue(Node head, int value) { + Node cur = head; + while (cur != null) { + if (cur.value == value) { + return false; + }else{ + cur = cur.next; + } + } + return true; + } + + + /** + * 功能描述 : 验证双链表删除结果 + * @author Leo + * @date 2020/11/19 3:40 下午 + * @param head + * @param value + * @return boolean + */ + public static boolean verifyRemoveDoubleNodeOfValue(DoubleNode head, int value) { + DoubleNode cur = head; + while (cur != null) { + if (cur.value == value) { + return false; + }else{ + cur = cur.next; + } + } + return true; + } + + /** + * 功能描述 : 随机生成单链表 + * @author Leo + * @date 2020/11/19 3:07 下午 + * @param sizeMax + * @param range + * @return leo.class02.DeleteGivenValue.Node + */ + public static Node randomNode(int sizeMax, int range) { + int size = (int) ((range + 1) * Math.random()); + if (size == 0) { + return null; + } + Node node = new Node(randomInt(range)); + Node pre = node; + size--; + while (size != 0) { + Node cur = new Node(randomInt(range)); + pre.next = cur; + pre = cur; + size--; + } + return node; + } + + /** + * 功能描述 : 随机生成双向链表 + * @author Leo + * @date 2020/11/19 3:33 下午 + * @param sizeMax + * @param range + * @throw + * @return leo.class02.DeleteGivenValue.DoubleNode + */ + public static DoubleNode randomDoubleNode(int sizeMax, int range) { + int size = (int) ((range + 1) * Math.random()); + if (size == 0) { + return null; + } + DoubleNode head = new DoubleNode(randomInt(range)); + DoubleNode pre = head; + size--; + while (size != 0) { + DoubleNode cur = new DoubleNode(randomInt(range)); + cur.pre = pre; + pre.next = cur; + pre = cur; + size--; + } + return head; + } + + public static int randomInt(int range) { + return (int) (((range + 1) * Math.random())-((range + 1) * Math.random())); + } + + + public static void main(String[] args) { + int sizeMax = 40; + int range = 80; + int testTime = 10000; + System.out.println("测试开始"); + for (int i = 0; i < testTime; i++) { + int value = randomInt(range); + Node nodeHead = randomNode(sizeMax, range); + Node node = removeNodeOfValue1(nodeHead, value); + + if (!verifyRemoveNodeOfValue(node,value)) { + System.out.println("node fuck!"); + break; + } + DoubleNode doubleNodeHead = randomDoubleNode(sizeMax, range); + DoubleNode doubleNode = removeDoubleNodeOfValue2(doubleNodeHead, value); + if (!verifyRemoveDoubleNodeOfValue(doubleNode, value)) { + System.out.println("doubleNode fuck"); + break; + } + + } + System.out.println("测试结束"); + + } +} diff --git a/src/leo/class02/LinkedList.java b/src/leo/class02/LinkedList.java index 2cb980c..a5d0acb 100644 --- a/src/leo/class02/LinkedList.java +++ b/src/leo/class02/LinkedList.java @@ -26,7 +26,7 @@ public class LinkedList { } } - public class DoubleNode{ + public static class DoubleNode{ int value; DoubleNode pre; DoubleNode next; @@ -105,6 +105,19 @@ public class LinkedList { return pre; } + public static Node reverseNode5(Node head) { + Node pre = null; + Node next = null; + while (head != null) { + + next = head.next; + head.next = pre; + pre = head; + head = next; + } + return pre; + } + public static DoubleNode reverseDoubleNode(DoubleNode head) { DoubleNode pre = null; @@ -119,6 +132,31 @@ public class LinkedList { return pre; } + public static DoubleNode reverseDoubleNode1(DoubleNode head) { + DoubleNode pre = null; + DoubleNode next = null; + while (head != null) { + next = head.next; + head.pre = next; + head.next = pre; + pre = head; + head = next; + } + return pre; + } + + public static DoubleNode reverseDoubleNode2(DoubleNode head) { + DoubleNode pre = null; + DoubleNode next = null; + while (head != null) { + next = head.next; + head.pre = next; + head.next = pre; + pre = head; + head = next; + } + return pre; + } /** * 功能描述 : 随机生成单链表 @@ -146,6 +184,34 @@ public class LinkedList { } + /** + * 功能描述 : 随机生成双向链表 + * @author Leo + * @date 2020/11/19 10:39 上午 + * @param sizeMix + * @param range + * @return leo.class02.LinkedList.DoubleNode + */ + public static DoubleNode randomDoubleNode(int sizeMix, int range) { + + int length = randomInt(sizeMix); + if (length == 0) { + return null; + } + DoubleNode head = new DoubleNode(randomInt(range)); + DoubleNode pre = head; + length--; + while (length != 0) { + DoubleNode cur = new DoubleNode(randomInt(range)); + pre.next = cur; + cur.pre = pre; + pre = cur; + length--; + } + return head; + + } + public static int randomInt(int range) { return (int) (Math.random() * (range + 1)); } @@ -161,7 +227,7 @@ public class LinkedList { public static boolean verifyReverseListAndNode(List nodeList, Node node) { Node cur = node; for (int i = nodeList.size() - 1; i >= 0; i--) { - if (cur==null||cur != nodeList.get(i)) { + if (cur == null || !cur.equals(nodeList.get(i))) { return false; } cur = cur.next; @@ -186,21 +252,59 @@ public class LinkedList { return list; } + /** + * 功能描述 : doubleNode转list + * @author Leo + * @date 2020/11/19 10:42 上午 + * @param doubleNode + * @return java.util.List + */ + public static List DoubleNodeToList(DoubleNode doubleNode) { + List list = new ArrayList<>(); + DoubleNode cur = doubleNode; + while (cur != null) { + list.add(cur); + cur = cur.next; + } + return list; + } + + public static boolean verifyReverseListAndDoubleNode(List doubleNodeList, DoubleNode doubleNode) { + DoubleNode cur = doubleNode; + for (int i = doubleNodeList.size() - 1; i >= 0; i--) { + if (cur == null || !cur.equals(doubleNodeList.get(i))) { + return false; + } + cur = cur.next; + } + return true; + } + public static void main(String[] args){ int maxSize = 40; int range = 90; - int testTime = 1000; + int testTime = 10000; System.out.println("测试开始"); for (int i = 0; i < testTime; i++) { Node head = randomNode(maxSize, range); List nodeList = nodeToList(head); - Node node = reverseNode4(head); + Node node = reverseNode5(head); if (!verifyReverseListAndNode(nodeList, node)) { System.out.println("nodeFuck!!"); break; } + DoubleNode doubleNodeHead = randomDoubleNode(maxSize, range); + List doubleNodeList = DoubleNodeToList(doubleNodeHead); + DoubleNode doubleNode = reverseDoubleNode2(doubleNodeHead); + if (!verifyReverseListAndDoubleNode(doubleNodeList, doubleNode)) { + System.out.println("doubleNodeFuck!!"); + break; + } } System.out.println("测试结束"); + + + } }