Leetcode203-移除链表元素(非递归+递归)

题目:leetcode203

解答

方法一:自己写的方法

ListNode* removeElements(ListNode* head, int val) 
    {
        //if(head == nullptr) return head;//在while中体现了
        ListNode dummy(INT_MIN);
        dummy.next = head;
        ListNode* p = head;
        ListNode* front = &dummy;
        
        while(p!=nullptr)
        {
            if(p->val == val){
                front->next = p->next;
            }else{
                front = front->next;
            }
            p = p->next;
        }
        return dummy.next;
    }

时间复杂度:n,空间复杂度:1//一个dummy结点,两个指针

24ms;-4%


优化1:不用p指针,用head指针替换p指针,节约一个指针的空间

ListNode* removeElements(ListNode* head, int val) 
    {
        //if(head == nullptr) return head;//在while中体现了
        ListNode dummy(INT_MIN);
        dummy.next = head;
        ListNode* front = &dummy;
        
        while(head!=nullptr)
        {
            if(head->val == val){
                front->next = head->next;
            }else{
                front = front->next;
            }
            head = head->next;
        }
        return dummy.next;
    }

优化2:不动head指针,只用fron指针traverse

ListNode* removeElements(ListNode* head, int val) 
    {
        ListNode dummy(INT_MIN);
        dummy.next = head;
        ListNode* front = &dummy;
        
        while(front!=nullptr)
        {
            if(front->next != nullptr && front->next->val == val){
                front->next = front->next->next;
            }else{
                front = front->next;
            }
        }
        return dummy.next;
    }


方法二:递归——非尾递归

ListNode* removeElements(ListNode* head, int val) {
        if(head == nullptr) return nullptr;
        head->next = removeElements(head->next,val);
        return head->val == val ? head->next : head;
    }

时间复杂度:n;空间复杂度:n

24ms;-4%


总结:

1.链表的常用的特殊测试用例有:① 空链表 ② 只有一个结点的链表 ③ 多个结点但是结点值相同的链表。
2.解题步骤:先实现功能,再重构优化代码。

3.简单的题目多思考递归的解法。

4.leetcode中几乎所有与删除链表结点有关的题目都不关心内存泄露,最好在移除结点之后把结点删除。

Leetcode203-移除链表元素(非递归+递归)_第1张图片
The comments of leetcode203.png


6.good taste-优雅处理边界情况。

Leetcode203-移除链表元素(非递归+递归)_第2张图片
边界处理和正常逻辑一致.png

注: 图片来源:Git设计原理的启示

你可能感兴趣的:(Leetcode203-移除链表元素(非递归+递归))