1.链接:. - 力扣(LeetCode)【点击即可跳转】
分析此题提供两种思路:
1.遍历原链表,将值为val的节点释放掉(双指针法)
定义一个pcur指针指向头节点,定义一个prev指针指向NULL
需要注意:链表中有连续的val 和 头节点就是val 的情况。
代码实现为:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* prev, *pcur;
prev = NULL;
pcur = head;
while (pcur) //pcur为空时,跳出循环
{
if (pcur->val != val)
{
prev = pcur;
pcur = pcur->next;
}
else
{ // 当pcur等于val
struct ListNode* pcurHead = pcur->next;
if (prev == NULL) // 头节点就为val的情况
{
free(pcur);
head = pcurHead; // 更新头节点
pcur = pcurHead; // 然后把新的头节点的地址赋给pcur
}
else
{
free(pcur); // 释放val元素
prev->next = pcurHead; // pcurHead存的是pcur的next,所以直接赋给prev的next
pcur = pcurHead; // 然后让pcur指向下一个节点的地址
}
}
}
return head;
}
2.找值不为val的节点,尾插到新链表中
创建新链表,定义newTail指针进行尾插,定义pcur指针进行遍历
需要注意:在跳出循环后,将newTail指向下一个节点的指针置为空。
struct ListNode* removeElements(struct ListNode* head, int val)
{
//创建一个空链表
struct ListNode* newHead, * newTail;
newHead = newTail = NULL;
//遍历原链表
struct ListNode* pcur = head;
while (pcur)
{
//找值不为val的节点,尾插到新链表中
if (pcur->val != val)
{
//链表为空
if (newHead == NULL)
{
newHead = newTail = pcur;
}
else//链表不为空
{
newTail->next = pcur;
newTail = newTail->next;
}
}
pcur = pcur->next;
}
if (newTail)
newTail->next = NULL;
return newHead;
}
感谢观看,如果对你有帮助,点赞支持一下吧^.^