题目描述
203.移除链表元素
删除链表中等于给定值 val 的所有节点。
示例1:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
题解
很简单的一道链表习题,定义两个指针plist和tail,分别指向链表的头结点和头结点的下一个结点,从tail指针开始一直往后走,如果值不等于val,则 plist指向tail,如果遇到等于val的值,则 tail 继续往后走即可(相当于跳过该结点)。
初始情况:
①如果 tail->val != val ,则plist的next指向tail,然后tail 继续向后走
②如果 tail->val == val ,则tail继续往后走,跳过该结点
跳过后,原链表的连接就会变成这样:
③重复②③过程,直到tail->next == NULL 为止(代表tail已经走完了该链表)
题解代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
if(head==NULL){
//结点为空
}
else if(head->next == NULL)
{
//结点只有一个
if(head->val == val)
return NULL;
else
return head;
}
else{ //结点为多个
//使第一个值不为val
while(head->val == val){
head=head->next;
if(head == NULL)
return NULL;
}
struct ListNode* plist = head;
struct ListNode* tail = head->next;
while(tail){
//如果值不相等,plist指向tail,
if(tail->val!=val)
{
plist->next = tail;
tail = tail->next;
plist=plist->next;
}
else{
tail=tail->next;
}
}
//跳出循环表示,tail已经遍历完了
plist->next = NULL;
return head;
}
}