作者:CK92_474 | 来源:互联网 | 2024-12-04 10:59
在链表中删除指定值的节点
给出一个链表和一个整数 num,输出删除链表中节点值等于 num 的节点之后的链表。
输入描述:
第一行一个整数 n,n 表示单链表的节点数量。
第二行 n 个整数表示单链表的各个节点的值。
第三行一个整数 num。
输出描述:
在给定的函数中返回指定链表的头指针。
示例1
输入
4
1 2 3 4
3
输出
1 2 4
备注:
1≤n≤1061 \leq n \leq 10^61≤n≤106
−106≤num,val≤106-10^6 \leq num,val \leq 10^6−106≤num,val≤106
题解:
正常的链表删除,不过有一个小技巧,创建一个哨兵节点,可以省很多事。
代码:
# include
using namespace std;struct list_node{int val;struct list_node * next;
};list_node * input_list()
{int val, n;scanf("%d", &n);list_node * phead &#61; new list_node();list_node * cur_pnode &#61; phead;for (int i &#61; 1; i <&#61; n; &#43;&#43;i) {scanf("%d", &val);if (i &#61;&#61; 1) {cur_pnode->val &#61; val;cur_pnode->next &#61; NULL;}else {list_node * new_pnode &#61; new list_node();new_pnode->val &#61; val;new_pnode->next &#61; NULL;cur_pnode->next &#61; new_pnode;cur_pnode &#61; new_pnode;}}return phead;
}list_node * remove_value(list_node * head, int num)
{list_node *dummy &#61; new list_node();dummy->next &#61; head;list_node *p &#61; head, *pre &#61; dummy;while (p) {if (p->val &#61;&#61; num) {pre->next &#61; p->next;delete p;p &#61; pre->next;} else {pre &#61; p;p &#61; p->next;}}return dummy->next;
}void print_list(list_node * head)
{while (head !&#61; NULL) {printf("%d ", head->val);head &#61; head->next;}puts("");
}int main ()
{list_node * head &#61; input_list();int num;scanf("%d", &num);list_node * new_head &#61; remove_value(head, num);print_list(new_head);return 0;
}