作者: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^6 1 ≤ n ≤ 1 0 6
−106≤num,val≤106-10^6 \leq num,val \leq 10^6 − 1 0 6 ≤ n u m , v a l ≤ 1 0 6
题解: 正常的链表删除,不过有一个小技巧,创建一个哨兵节点,可以省很多事。
代码&#xff1a; # 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 ; }