Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
力扣203. 移除链表元素
一、题目描述:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 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 输出:[]
提示:
列表中的节点数目在范围 [0, 10^4] 内 1 <= Node.val <= 50 0 <= val <= 50
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
链表的题目一般来说应该都可以使用递归解决,这里我的第一想法是用递归解决。我们看这个链表,先判断它是否为空,如果为空就没必要执行删除操作了,这也是递归的终止条件。如果不为空,就判断head的值是不是等于val,如果是相等的,就需要删除head,删除head就是将head->next的值放到head。如果不相等,就保留head。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是一次通过的,有些细节没有考虑到。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
还有一种使用迭代的方法删除节点。通过将该节点的next指向该节点的next.next将该节点从链表移出。
这种解法需要注意的是,我们需要建立一个哑节点。令哑节点的next指向head,然后遍历进行删除操作。
三、AC 代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
//递归的终止条件
if(head == NULL){
return head;
}
head->next = removeElements(head->next, val);
return head->val == val ? head->next : head;
}
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode tempHead = new ListNode(0);
tempHead.next = head;
ListNode t = tempHead;
while (t.next != null) {
if (t.next.val == val) {
t.next = t.next.next;
} else {
t = t.next;
}
}
return tempHead.next;
}
}
四、总结:
很正常的链表操作!得多学习!