目录
题目描述:
题目解读(分析)
解决代码
题目描述:
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
题目解读(分析):
对于需要删除链表中val的值,我们立马可以想到一种方法一就是遍历循环寻找val这个值,进行删除该节点,这中方法是最容易想出来的,可是时间复杂度是为O()。
而这里我们还有一种方法二就是用类似空间换时间的方法(这里没有向内存申请空间,也同样将时间复杂度降为O(n))。这里我们着重讲解这个方法,这个方法就是直接创建一个新的链表来收集删除所有删除val值的节点,并进行连接。如图展示:
写代码过程中我们需要使用ptail来遍历新链表,plist来存储新链表的头节点,而pcur是用来遍历原链表和val进行比较,然后得到符合题意的节点移动到ptail中。在最后时如果ptail不为空,那就必须将ptail->next置空,可以将这个作为结束节点,避免返回不符合题意值。
解决代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
ListNode* removeElements(ListNode* head, int val) {
// assert(head);
ListNode* plist = NULL;//存储
ListNode* ptail = NULL;//筛选
ListNode* pcur = head;//遍历
while (pcur)
{
if(pcur->val != val)
{
if(ptail == NULL)
{
ptail = plist = pcur;
}
else
{
ptail->next = pcur;
ptail = ptail->next;
}
}
pcur=pcur->next;
}
//考虑为空
if(plist != NULL)
{
ptail->next = NULL;
}
return plist;
}