-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathJAVA_18_1.java
117 lines (104 loc) · 3.36 KB
/
JAVA_18_1.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package chapter3;
import base.ListNode;
/**
* 删除链表的节点
* <p>
* 在O(1)的时间内删除链表节点
* <p>
* 考察点:链表的编程能力,思维的全面性
*/
public class JAVA_18_1 {
//不一定要删除节点,可以把下一个节点的值复制过来,然后把指针指向下一个节点的下一个节点处
public static void deleteNode(ListNode head, ListNode toDeleteNode) {
if (toDeleteNode.nextNode == null) {
if (head.nextNode == null) {
//如果只有一个节点
head.value = -1;
return;
} else {
//尾节点需要遍历处理,时间复杂度是O(n)
while (head.nextNode != toDeleteNode) {
head = head.nextNode;
}
head.nextNode = null;
return;
}
}
//非尾节点时间复杂度只有O(1)
toDeleteNode.value = toDeleteNode.nextNode.value;
toDeleteNode.nextNode = toDeleteNode.nextNode.nextNode;
}
public static void main(String[] argv) {
test1();
test2();
test3();
}
private static void test1() {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
node1.nextNode = node2;
node2.nextNode = node3;
node3.nextNode = node4;
System.out.println("原链表为");
ListNode node = node1;
while (node != null) {
System.out.print(node.value + "->");
node = node.nextNode;
}
System.out.println("null");
System.out.println("删除后的链表为");
node = node1;
deleteNode(node1, node3);
while (node != null) {
System.out.print(node.value + "->");
node = node.nextNode;
}
System.out.println("null");
System.out.println("--------");
}
private static void test2() {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
node1.nextNode = node2;
node2.nextNode = node3;
node3.nextNode = node4;
System.out.println("原链表为");
ListNode node = node1;
while (node != null) {
System.out.print(node.value + "->");
node = node.nextNode;
}
System.out.println("null");
System.out.println("删除后的链表为");
node = node1;
deleteNode(node1, node4);
while (node != null) {
System.out.print(node.value + "->");
node = node.nextNode;
}
System.out.println("null");
}
private static void test3() {
ListNode node1 = new ListNode(1);
System.out.println("原链表为");
ListNode node = node1;
while (node != null) {
System.out.print(node.value + "->");
node = node.nextNode;
}
System.out.println("null");
System.out.println("删除后的链表为");
node = node1;
deleteNode(node1, node1);
while (node != null) {
if(node.value != -1) {
System.out.print(node.value);
}
node = node.nextNode;
}
}
}