题目难度:肥肠煎蛋
题目描述:
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
此题对比原题有改动
题目保证链表中节点的值互不相同
该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000示例1:
输入:{2,5,1,9},5
返回值:{2,1,9}
说明:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9
两种写法:
写法一:直接用源head,需要单独考虑删除头节点
时间复杂度:O(n)
class Solution { public: ListNode* deleteNode(ListNode* head, int val) { if(head == nullptr) return head; ListNode* cur = head; // if delete head node if(head->val == val) head = head->next; // others node while(cur->next) { if(cur->next->val == val) { cur->next = cur->next->next; break; } cur = cur->next; } return head; } };
写法二:虚拟头节点
时间复杂度:O(n)
class Solution { public: ListNode* deleteNode(ListNode* head, int val) { ListNode* dummyHead = new ListNode(0); dummyHead->next = head; ListNode* pre = dummyHead; ListNode* cur = head; while(cur) { if(cur->val == val) { pre->next = cur->next; break; } pre = cur; cur = cur->next; } return dummyHead->next; } }
🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓