力扣Leet Code刷题笔记(一)–203.移除链表元素
这是我的刷题笔记的第一篇,后面会持续更新我的学习笔记,不止会有数据结构与算法上的学习,还会有数电模电,操作系统,单片机,linux,服务器等等
前言
这篇文章使用c语言进行实现
下面会出现的英文意思
p+单词缩写:
- p->pointer
- cur->current
- pre->previous
我们开始吧
点此直达哦->移除链表元素
题目描述
给你一个链表的头节点head
和一个整数val
,请你删除链表中所有满足Node.val == val
的节点,并返回 新的头节点 。
/**
* Definition for singly-linked list.
* struct ListNode
* {
* int val;
* struct ListNode *next;
* };
*/
示例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
输出: []
解题思路
这里我经过我的思考和借鉴,我最终使用了三种方法去完成这道题目的解答
方法一: 定义新链表 并尾插所需要的元素
思路: 只需要将需要的节点添加到新链表即可
- 我们先定义一个新的指针
newhead
用来保存新链表的头 - 定义指针
newtail
保存新链表的尾巴,用于尾插 - 定义指针
pcur
来保存当前遍历的节点 - 遍历链表
- 当前节点的值和需要比较的值不相等,尾插节点
- 链表为空:头指针和尾指针同指向pcur
- 链表不为空:尾插pcur到尾巴
- 当前节点的值和需要比较的值不相等,尾插节点
- 如果新链表不为空,在某些情况尾指针指向的下一个节点不是NULL,因此尾指针指向的下一个节点需要手动指向NULL
就如上后面的示例一,加入前面五个节点之后此时尾指针指向值为5这个节点,这个节点存储的指针又指向了值为6的节点,所以我们需要手动将尾指针指向NULL
还有什么情况呢,动手试试吧
- 返回新链表的头指针
Code 代码:
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val)
{
ListNode* newhead