目录
一些命名的介绍
cur:当前结点
prev:前继结点
next:后继结点
1-5题单链表的经典例题
6-8题单链表的带环问题
1. 删除链表中等于给定值 val 的所有节点。
题目分析:
方法一:哨兵结点
本题用的方法是在head前设一个新的结点 给prev head的位置给cur
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode
struct ListNode* removeElements(struct ListNode* head, int val)
{
ListNode *sentinel =(ListNode*)malloc(sizeof(ListNode));//开辟一个哨兵结点
sentinel->next = head;//让哨兵结点指向head
ListNode *cur = head; //cur指向head
ListNode *prev = sentinel;//prev指向哨兵结点
while (cur != NULL)
{
if (cur->val == val)//当cur中的值 = 输入的值时 进入循环
{
prev->next = cur->next;//让prev指向next;
}
else
{
prev = cur;//将prev移动到cur的位置
}
cur = cur->next;//cur移动到下一个位置
}
head = sentinel->next ;
free(sentinel);//新开辟的空间最后要free一下 防止内存泄漏
return head;
}
方法二:尾插法
/* Definition for singly-linked list.
* struct ListNode
{
* int val;
* struct ListNode *next;
* }; */
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val)
{
ListNode* cur = head;
ListNode* newhead = (ListNode*)malloc(sizeof(ListNode));
newhead->n