Skip to content

Commit 8b57250

Browse files
committed
feat: add solutions to lcof problem: No.18
1 parent 286d878 commit 8b57250

File tree

7 files changed

+116
-103
lines changed

7 files changed

+116
-103
lines changed

lcof/面试题18. 删除链表的节点/README.md

Lines changed: 75 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,15 @@
3333

3434
## 解法
3535

36-
定义一个虚拟头节点 `dummy` 指向 `head``pre` 指针初始指向 `dummy`
36+
**方法一:模拟**
3737

38-
循环遍历链表,`pre` 往后移动。当指针 `pre.next` 指向的节点的值等于 `val` 时退出循环,将 `pre.next` 指向 `pre.next.next`,然后返回 `dummy.next`
38+
我们先创建一个虚拟头节点 `dummy`,令 `dummy.next = head`,然后创建一个指针 `cur` 指向 `dummy`
39+
40+
遍历链表,当 `cur.next.val == val` 时,将 `cur.next` 指向 `cur.next.next`,然后跳出循环。
41+
42+
最后返回 `dummy.next` 即可。
43+
44+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为链表的长度。
3945

4046
<!-- tabs:start -->
4147

@@ -49,10 +55,12 @@
4955
# self.next = None
5056
class Solution:
5157
def deleteNode(self, head: ListNode, val: int) -> ListNode:
52-
pre = dummy = ListNode(next=head)
53-
while pre.next and pre.next.val != val:
54-
pre = pre.next
55-
pre.next = None if not pre.next else pre.next.next
58+
dummy = cur = ListNode(0, head)
59+
while cur.next:
60+
if cur.next.val == val:
61+
cur.next = cur.next.next
62+
break
63+
cur = cur.next
5664
return dummy.next
5765
```
5866

@@ -68,39 +76,42 @@ class Solution:
6876
* }
6977
*/
7078
class Solution {
71-
7279
public ListNode deleteNode(ListNode head, int val) {
7380
ListNode dummy = new ListNode(0, head);
74-
ListNode pre = dummy;
75-
for (; pre.next != null && pre.next.val != val; pre = pre.next)
76-
;
77-
pre.next = pre.next == null ? null : pre.next.next;
81+
for (ListNode cur = dummy; cur.next != null; cur = cur.next) {
82+
if (cur.next.val == val) {
83+
cur.next = cur.next.next;
84+
break;
85+
}
86+
}
7887
return dummy.next;
7988
}
8089
}
8190
```
8291

83-
### **JavaScript**
92+
### **C++**
8493

85-
```js
94+
```cpp
8695
/**
8796
* Definition for singly-linked list.
88-
* function ListNode(val) {
89-
* this.val = val;
90-
* this.next = null;
91-
* }
92-
*/
93-
/**
94-
* @param {ListNode} head
95-
* @param {number} val
96-
* @return {ListNode}
97+
* struct ListNode {
98+
* int val;
99+
* ListNode *next;
100+
* ListNode(int x) : val(x), next(NULL) {}
101+
* };
97102
*/
98-
var deleteNode = function (head, val) {
99-
const dummy = new ListNode(0, head);
100-
let pre = dummy;
101-
for (; pre.next && pre.next.val != val; pre = pre.next);
102-
pre.next = pre.next?.next;
103-
return dummy.next;
103+
class Solution {
104+
public:
105+
ListNode* deleteNode(ListNode* head, int val) {
106+
ListNode* dummy = new ListNode(0, head);
107+
for (ListNode* cur = dummy; cur->next; cur = cur->next) {
108+
if (cur->next->val == val) {
109+
cur->next = cur->next->next;
110+
break;
111+
}
112+
}
113+
return dummy->next;
114+
}
104115
};
105116
```
106117
@@ -116,37 +127,40 @@ var deleteNode = function (head, val) {
116127
*/
117128
func deleteNode(head *ListNode, val int) *ListNode {
118129
dummy := &ListNode{0, head}
119-
pre := dummy
120-
for ; pre.Next != nil && pre.Next.Val != val; pre = pre.Next {
121-
}
122-
if pre.Next != nil {
123-
pre.Next = pre.Next.Next
130+
for cur := dummy; cur.Next != nil; cur = cur.Next {
131+
if cur.Next.Val == val {
132+
cur.Next = cur.Next.Next
133+
break
134+
}
124135
}
125136
return dummy.Next
126137
}
127138
```
128139

129-
### **C++**
140+
### **JavaScript**
130141

131-
```cpp
142+
```js
132143
/**
133144
* Definition for singly-linked list.
134-
* struct ListNode {
135-
* int val;
136-
* ListNode *next;
137-
* ListNode(int x) : val(x), next(NULL) {}
138-
* };
145+
* function ListNode(val) {
146+
* this.val = val;
147+
* this.next = null;
148+
* }
139149
*/
140-
class Solution {
141-
public:
142-
ListNode* deleteNode(ListNode* head, int val) {
143-
ListNode* dummy = new ListNode(0, head);
144-
ListNode* pre = dummy;
145-
for (; pre->next && pre->next->val != val; pre = pre->next)
146-
;
147-
pre->next = pre->next ? pre->next->next : nullptr;
148-
return dummy->next;
150+
/**
151+
* @param {ListNode} head
152+
* @param {number} val
153+
* @return {ListNode}
154+
*/
155+
var deleteNode = function (head, val) {
156+
const dummy = new ListNode(0, head);
157+
for (let cur = dummy; cur.next; cur = cur.next) {
158+
if (cur.next.val == val) {
159+
cur.next = cur.next.next;
160+
break;
161+
}
149162
}
163+
return dummy.next;
150164
};
151165
```
152166

@@ -195,23 +209,18 @@ impl Solution {
195209
* public ListNode(int x) { val = x; }
196210
* }
197211
*/
198-
199-
public class Solution {
200-
public ListNode DeleteNode(ListNode head, int val) {
201-
if (head == null) {
202-
return null;
203-
}
204-
if (head.val == val) {
205-
return head.next;
206-
}
207-
ListNode p = head;
208-
while (p.next != null && p.next.val != val) {
209-
p = p.next;
210-
}
211-
p.next = p.next == null ? null : p.next.next;
212-
return head;
213-
}
214-
}
212+
public class Solution {
213+
public ListNode DeleteNode(ListNode head, int val) {
214+
ListNode dummy = new ListNode(0, head);
215+
for (ListNode cur = dummy; cur.next != null; cur = cur.next) {
216+
if (cur.next.val == val) {
217+
cur.next = cur.next.next;
218+
break;
219+
}
220+
}
221+
return dummy.next;
222+
}
223+
}
215224
```
216225

217226
### **...**

lcof/面试题18. 删除链表的节点/Solution.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ class Solution {
1010
public:
1111
ListNode* deleteNode(ListNode* head, int val) {
1212
ListNode* dummy = new ListNode(0, head);
13-
ListNode* pre = dummy;
14-
for (; pre->next && pre->next->val != val; pre = pre->next)
15-
;
16-
pre->next = pre->next ? pre->next->next : nullptr;
13+
for (ListNode* cur = dummy; cur->next; cur = cur->next) {
14+
if (cur->next->val == val) {
15+
cur->next = cur->next->next;
16+
break;
17+
}
18+
}
1719
return dummy->next;
1820
}
1921
};

lcof/面试题18. 删除链表的节点/Solution.cs

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,15 @@
66
* public ListNode(int x) { val = x; }
77
* }
88
*/
9-
10-
public class Solution {
11-
public ListNode DeleteNode(ListNode head, int val) {
12-
if (head == null) {
13-
return null;
14-
}
15-
if (head.val == val) {
16-
return head.next;
17-
}
18-
ListNode p = head;
19-
while (p.next != null && p.next.val != val) {
20-
p = p.next;
21-
}
22-
p.next = p.next == null ? null : p.next.next;
23-
return head;
24-
}
25-
}
9+
public class Solution {
10+
public ListNode DeleteNode(ListNode head, int val) {
11+
ListNode dummy = new ListNode(0, head);
12+
for (ListNode cur = dummy; cur.next != null; cur = cur.next) {
13+
if (cur.next.val == val) {
14+
cur.next = cur.next.next;
15+
break;
16+
}
17+
}
18+
return dummy.next;
19+
}
20+
}

lcof/面试题18. 删除链表的节点/Solution.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
*/
88
func deleteNode(head *ListNode, val int) *ListNode {
99
dummy := &ListNode{0, head}
10-
pre := dummy
11-
for ; pre.Next != nil && pre.Next.Val != val; pre = pre.Next {
12-
}
13-
if pre.Next != nil {
14-
pre.Next = pre.Next.Next
10+
for cur := dummy; cur.Next != nil; cur = cur.Next {
11+
if cur.Next.Val == val {
12+
cur.Next = cur.Next.Next
13+
break
14+
}
1515
}
1616
return dummy.Next
1717
}

lcof/面试题18. 删除链表的节点/Solution.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
class Solution {
1010
public ListNode deleteNode(ListNode head, int val) {
1111
ListNode dummy = new ListNode(0, head);
12-
ListNode pre = dummy;
13-
for (; pre.next != null && pre.next.val != val; pre = pre.next)
14-
;
15-
pre.next = pre.next == null ? null : pre.next.next;
12+
for (ListNode cur = dummy; cur.next != null; cur = cur.next) {
13+
if (cur.next.val == val) {
14+
cur.next = cur.next.next;
15+
break;
16+
}
17+
}
1618
return dummy.next;
1719
}
1820
}

lcof/面试题18. 删除链表的节点/Solution.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@
1212
*/
1313
var deleteNode = function (head, val) {
1414
const dummy = new ListNode(0, head);
15-
let pre = dummy;
16-
for (; pre.next && pre.next.val != val; pre = pre.next);
17-
pre.next = pre.next?.next;
15+
for (let cur = dummy; cur.next; cur = cur.next) {
16+
if (cur.next.val == val) {
17+
cur.next = cur.next.next;
18+
break;
19+
}
20+
}
1821
return dummy.next;
1922
};

lcof/面试题18. 删除链表的节点/Solution.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
# self.next = None
66
class Solution:
77
def deleteNode(self, head: ListNode, val: int) -> ListNode:
8-
pre = dummy = ListNode(next=head)
9-
while pre.next and pre.next.val != val:
10-
pre = pre.next
11-
pre.next = None if not pre.next else pre.next.next
8+
dummy = cur = ListNode(0, head)
9+
while cur.next:
10+
if cur.next.val == val:
11+
cur.next = cur.next.next
12+
break
13+
cur = cur.next
1214
return dummy.next

0 commit comments

Comments
 (0)