题解 | 从单向链表中删除指定值的节点
从单向链表中删除指定值的节点
https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
#include <iostream>
using namespace std;
struct ListNode
{
int val;
struct ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int v) : val(v), next(nullptr) {}
};
struct LinkedList
{
struct ListNode *head;
int size;
LinkedList()
{
head = new ListNode;
size = 0;
}
void add_front(int v)
{
auto node = new ListNode(v);
if (node == nullptr) return;
ListNode *next_node = head->next;
head->next = node;
node->next = next_node;
size++;
}
ListNode* find_node(int v)
{
ListNode *curr = head->next;
while (curr != nullptr) {
if (curr->val == v) return curr;
curr = curr->next;
}
return nullptr;
}
ListNode* find_prev(int v)
{
ListNode *curr = head;
while (curr != nullptr && curr->next != nullptr) {
if (curr->next->val == v) return curr;
curr = curr->next;
}
return nullptr;
}
void add_behind_node(int a, int b)
{
ListNode *target = find_node(a);
if (target == nullptr) return;
ListNode *next_node = target->next;
if (find_node(b) != nullptr) return;
auto new_node = new ListNode(b);
if (new_node == nullptr) return;
target->next = new_node;
new_node->next = next_node;
size++;
}
void del_node(int v)
{
ListNode *prev_node = find_prev(v);
if (prev_node == nullptr) return;
ListNode *del_node = prev_node->next;
if (del_node == nullptr) return;
ListNode *nxt_node = del_node->next;
prev_node->next = nxt_node;
delete del_node;
}
void print_all()
{
ListNode *curr = head->next;
while (curr != nullptr) {
cout << curr->val << " ";
curr = curr->next;
}
cout << endl;
}
~LinkedList()
{
ListNode *curr = head;
while (curr != nullptr) {
ListNode *del_node = curr;
curr = curr->next;
delete del_node;
size--;
}
}
};
int main() {
LinkedList linked_list;
int n, h;
cin >> n >> h;
linked_list.add_front(h);
while (n-- > 0) {
int a, b;
cin >> a >> b;
linked_list.add_behind_node(b, a);
}
int k;
cin >> k;
linked_list.del_node(k);
linked_list.print_all();
}
// 64 位输出请用 printf("%lld")

查看10道真题和解析