问题:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
struct ListNode* removeElements(struct ListNode* head, int val){}
思路:
本题主要是考察链表的删除,而删除操作细分可以分为头删、尾删、中间任意位置删除。
对于链表而言尾删和中间任意位置删除思路一样,所以本题就分为头删和中间位置删除两部分来考虑。
指针变量的设计
由于本题的head指针是头指针,必须指向头部,那么要想使链表移动的话,就要新创建一个指针cur。同时易知在单链表的删除操作中,只有一个指针是无法完成的,所以还要一个指针prev,用于指向cur的前驱。
1.头删
头删时,cur是指向当前的头结点,然后只需要head指针指向head->next,整个链表的表头就移动了。然后再free掉cur指向的原来的那个结点,cur再指向head所指向的头结点即可。
2.中间任意位置删除
中间位置删除的话要稍微复杂那么一丢丢。主要是要用pre指针去1保留被删结点cur的前驱。
核心代码解释就到这了,剩下的话以读者的聪明才智肯定可以想出来,我就不解释咯。
完整代码:
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode*prev=NULL,*cur=head;
while(cur)
{
if(cur->val==val)
{
if(head==cur)//头删
{
head=head->next;
free(cur);
cur=head;
}
else
{
prev->next=cur->next;
free(cur);
cur=prev->next;
}
}
else
{
prev=cur;
cur=cur->next;
}
}
return head;
}
记录学习,滴水成冰。诸君共勉。