题目来自LeetCode,链接:面试题18. 删除链表的节点。具体描述为:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。题目保证链表中节点的值互不相同。
示例1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
这道题也比较简单的,用两个指针prev
和node
分别指向head
和head.next
,当node为要删除的节点时直接prev.next=node.next
就实现了删除功能,需要注意的是一些边界情况,也就是要删除的节点为头节点或没有要删除的节点(这种情况最后node=null
)。时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
1
)
O(1)
O(1)。
JAVA版代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if (head.val == val) {
return head.next;
}
ListNode prev = head;
ListNode node = head.next;
while (node != null && node.val != val) {
node = node.next;
prev = prev.next;
}
if (node != null) {
prev.next = node.next;
}
return head;
}
}
提交结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/866fb8418b9abfd6980c8ac34d61ed44.png)
Python版代码如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, head: ListNode, val: int) -> ListNode:
if head.val == val:
return head.next
prev = head
node = head.next
while node is not None and node.val != val:
node = node.next
prev = prev.next
if node is not None:
prev.next = node.next
return head
提交结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8725673a8b6e646f07695bc78b4b1015.png)