题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
// #include <bits/stdc++.h>
#include <iostream>
#include <list>
using namespace std;
struct ListNode{
int val;
ListNode *next;
ListNode():val(0), next(nullptr){}
ListNode(int x): val(x), next(nullptr){}
ListNode(int x, ListNode *nxt): val(x), next(nxt){}
};
ListNode* find_val(ListNode *head, int target){
while(head->val != target && head){
head = head->next;
}
return head;
}
int main() {
int n, head;
cin >> n >> head;
ListNode *list_head = new ListNode(head);
int insert_val, front_node_val;
for(int i = 0; i < n - 1; i++){ // 挨个插入链表
cin >> insert_val >> front_node_val;
ListNode *insert_node = new ListNode(insert_val);
ListNode *cur = find_val(list_head, front_node_val);
insert_node -> next = cur -> next;
cur -> next = insert_node;
}
int delete_val;
cin >> delete_val;
ListNode *dummy = new ListNode(0, list_head);
ListNode *pre = dummy;
while(pre -> next -> val != delete_val){
pre = pre -> next;
}
ListNode *temp = pre->next;
pre->next = pre->next->next;
delete temp;
list_head = dummy->next;
while(list_head){
cout << list_head->val << " ";
list_head = list_head->next;
}
return 0;
}
// 64 位输出请用 printf("%lld")
其实可以使用STL容器中的forward list,使用find()函数找到节点,insert_after()在前面找到的节点后边插入,这样会更简便。但是既然是给自己练习用的,那就把链表那一套再练习练习,多写写熟练就好,有时候遇到题目比如链表部分翻转的ACM模式题目,也能更得心应手
查看18道真题和解析