移除链表元素数据结构oj题(力扣题206)
目录
题目描述:
题目解读(分析)
解决代码
题目描述:
给你一个链表的头节点 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;
}