1. 概述
在编程中,我们经常会遇到需要删除链表中的节点的情况。删除链表中的节点可以通过修改指针的指向来实现,而不需要真正删除节点的内存空间。
2. 删除链表节点的方法
2.1 删除链表中的指定节点
要删除链表中的指定节点,我们需要先找到要删除的节点的前一个节点。然后将前一个节点的指针指向要删除节点的下一个节点,即可实现删除。
2.2 基于Python实现
下面我们将基于Python实现删除链表中的节点。
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def deleteNode(head, val):
# 若头结点为要删除的节点
if head and head.val == val:
return head.next
cur = head
while cur and cur.next:
if cur.next.val == val:
cur.next = cur.next.next
return head
cur = cur.next
return head
以上代码中,我们定义了一个ListNode类作为链表的节点,每个节点有一个值val和一个指向下一个节点的指针next。然后我们实现了一个deleteNode函数来删除链表中的指定节点。
首先,我们判断头节点是否为要删除的节点,如果是,则直接返回头节点的下一个节点作为新的头节点。
然后,我们使用一个指针cur来遍历链表。在遍历过程中,我们检查cur的下一个节点是否为要删除的节点。如果是,我们修改cur的指针,将其指向要删除节点的下一个节点,实现删除操作。
最后,我们返回链表的头节点。
2.3 基于C++实现
下面我们将基于C++实现删除链表中的节点。
#include
using namespace std;
struct ListNode
{
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* deleteNode(ListNode* head, int val) {
if (head == NULL) return NULL;
if (head->val == val) {
return head->next;
}
ListNode* cur = head;
while (cur->next) {
if (cur->next->val == val) {
cur->next = cur->next->next;
return head;
}
cur = cur->next;
}
return head;
}
以上代码中,我们定义了一个ListNode结构体作为链表的节点,每个节点有一个值val和一个指向下一个节点的指针next。然后我们实现了一个deleteNode函数来删除链表中的指定节点。
首先,我们判断头节点是否为要删除的节点,如果是,则直接返回头节点的下一个节点作为新的头节点。
然后,我们使用一个指针cur来遍历链表。在遍历过程中,我们检查cur的下一个节点是否为要删除的节点。如果是,我们修改cur的指针,将其指向要删除节点的下一个节点,实现删除操作。
最后,我们返回链表的头节点。
3. 总结
通过本文,我们学习了基于Python和C++分别实现删除链表节点的方法。删除链表节点可以通过修改指针的指向来实现,而不需要真正删除节点的内存空间。这种方法时间复杂度为O(n),其中n是链表的长度。
代码部分:
基于Python的代码:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def deleteNode(head, val):
# 若头结点为要删除的节点
if head and head.val == val:
return head.next
cur = head
while cur and cur.next:
if cur.next.val == val:
cur.next = cur.next.next
return head
cur = cur.next
return head
基于C++的代码:
#include
using namespace std;
struct ListNode
{
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* deleteNode(ListNode* head, int val) {
if (head == NULL) return NULL;
if (head->val == val) {
return head->next;
}
ListNode* cur = head;
while (cur->next) {
if (cur->next->val == val) {
cur->next = cur->next->next;
return head;
}
cur = cur->next;
}
return head;
}