forked from carpeventus/coding-interviews
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDeleteNode.java
More file actions
58 lines (53 loc) · 1.67 KB
/
DeleteNode.java
File metadata and controls
58 lines (53 loc) · 1.67 KB
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
package Chap3;
/**
* 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点。假设要删除的结点确实在链表中
*/
public class DeleteNode {
private class Node {
int val;
Node next;
}
/**
* 常规方法,从first开始找到要删除结点的前一个结点,时间复杂度为O(n)
*/
public void deleteNode_2(Node first, Node toBeDel) {
if (first == null || toBeDel == null) {
return;
}
// 要删除的就是链表头,它没有前一个结点
if (first == toBeDel) {
first = first.next;
} else {
Node cur = first;
while (cur.next != toBeDel) {
cur = cur.next;
}
// cur为toBeDel的前一个结点
cur.next = cur.next.next;
}
}
/**
* 将toBeDel的下一个结点j的值复制给toBeDel。然后将toBeDel指向j的下一个结点
*/
public void deleteNode(Node first, Node toBeDel) {
if (first == null || toBeDel == null) {
return;
}
// 要删除的不是最后一个结点
if (toBeDel.next != null) {
Node p = toBeDel.next;
toBeDel.val = p.val;
toBeDel.next = p.next;
// 是尾结点也是头结点
} else if (first == toBeDel) {
first = first.next;
// 仅仅是尾结点,即在含有多个结点的链表中删除尾结点
} else {
Node cur = first;
while (cur.next != toBeDel) {
cur = cur.next;
}
cur.next = null;
}
}
}