题目: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中几乎所有与删除链表结点有关的题目都不关心内存泄露,最好在移除结点之后把结点删除。

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

注:图片来源:Git设计原理的启示
网友评论