You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
466 lines
12 KiB
466 lines
12 KiB
package leo.class02_03;
|
|
|
|
/**
|
|
* @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;
|
|
|
|
}
|
|
|
|
|
|
public static Node removeNodeOfValue2(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;
|
|
}
|
|
|
|
public static Node removeNodeOfValue3(Node head, int value) {
|
|
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 = head;
|
|
}
|
|
cur = cur.next;
|
|
}
|
|
return head;
|
|
}
|
|
|
|
public static Node removeNodeOfValue4(Node head, int value) {
|
|
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;
|
|
|
|
}
|
|
|
|
/**
|
|
* 功能描述 : 双链表删除某个给定值
|
|
* @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;
|
|
}else{
|
|
cur.pre = pre;
|
|
pre = cur;
|
|
}
|
|
cur = cur.next;
|
|
}
|
|
return head;
|
|
}
|
|
|
|
public static DoubleNode removeDoubleNodeOfValue3(DoubleNode head, int value) {
|
|
while (head != null) {
|
|
if (head.value != value) {
|
|
break;
|
|
|
|
}
|
|
head = head.next;
|
|
}
|
|
if (head != null && head.pre != null) {
|
|
head.pre = null;
|
|
}
|
|
DoubleNode cur = head;
|
|
DoubleNode pre = head;
|
|
while (cur != null) {
|
|
if (cur.value == value) {
|
|
pre.next = cur.next;
|
|
}else{
|
|
if (cur.pre != pre) {
|
|
cur.pre = pre;
|
|
}
|
|
pre = cur;
|
|
}
|
|
cur = cur.next;
|
|
}
|
|
|
|
return head;
|
|
}
|
|
|
|
public static DoubleNode removeDoubleNodeOfValue4(DoubleNode head, int value) {
|
|
while (head != null) {
|
|
if (head.value != value) {
|
|
break;
|
|
}
|
|
head = head.next;
|
|
}
|
|
if (head != null) {
|
|
head.pre = null;
|
|
}
|
|
DoubleNode pre = head;
|
|
DoubleNode cur = head;
|
|
while (cur != null) {
|
|
if (cur.value == value) {
|
|
pre.next = cur.next;
|
|
}else{
|
|
if (cur.pre != pre) {
|
|
cur.pre = pre;
|
|
}
|
|
pre = cur;
|
|
}
|
|
cur = cur.next;
|
|
}
|
|
return head;
|
|
}
|
|
|
|
public static DoubleNode removeDoubleNodeOfValue5(DoubleNode head, int value) {
|
|
while (head != null) {
|
|
if (head.value != value) {
|
|
break;
|
|
}
|
|
head = head.next;
|
|
}
|
|
if (head != null && head.pre != null) {
|
|
head.pre = null;
|
|
}
|
|
|
|
DoubleNode pre = head;
|
|
DoubleNode cur = head;
|
|
while (cur != null) {
|
|
if (cur.value == value) {
|
|
pre.next = cur.next;
|
|
}else{
|
|
if (cur.pre != pre) {
|
|
cur.pre = pre;
|
|
}
|
|
pre = cur;
|
|
}
|
|
cur = cur.next;
|
|
}
|
|
return head;
|
|
}
|
|
|
|
public static DoubleNode removeDoubleNodeOfValue6(DoubleNode head, int value) {
|
|
while (head != null) {
|
|
if (head.value != value) {
|
|
head.pre = null;
|
|
break;
|
|
}
|
|
head = head.next;
|
|
}
|
|
DoubleNode pre = head;
|
|
DoubleNode cur = head;
|
|
while (cur != null) {
|
|
if (cur.value == value) {
|
|
pre.next = cur.next;
|
|
cur.pre = null;
|
|
if (cur.next != null) {
|
|
pre.next.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 = 80;
|
|
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 = removeNodeOfValue4(nodeHead, value);
|
|
|
|
if (!verifyRemoveNodeOfValue(node,value)) {
|
|
System.out.println("node fuck!");
|
|
break;
|
|
}
|
|
DoubleNode doubleNodeHead = randomDoubleNode(sizeMax, range);
|
|
DoubleNode doubleNode = removeDoubleNodeOfValue6(doubleNodeHead, value);
|
|
if (!verifyRemoveDoubleNodeOfValue(doubleNode, value)) {
|
|
System.out.println("doubleNode fuck");
|
|
break;
|
|
}
|
|
|
|
}
|
|
System.out.println("测试结束");
|
|
|
|
}
|
|
}
|