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等于valstruct 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的nextpcur = 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;
}
感谢观看,如果对你有帮助,点赞支持一下吧^.^