代码随想录训练营打卡DAY 3 | 反转链表
移除链表元素
设计链表
以上两题自己编写的时候也较为顺利,虚头节点的使用也比较熟练,故略。
反转链表
题解
思路:带虚头节点的链表只要使用头插法即可实现链表的反转。
注意:笔者忽略了一个问题,反转后最后一个节点(即原链表的头节点)的next应当为空,笔者一开始没有改该指针,导致最后链表出现环,从而AC不了。
核心代码【C++】:
ListNode* reverseList(ListNode* head) {
if(!head || !head->next) return head;
//至少有2个元素时进行反转
ListNode * pre = head;
ListNode * p = pre->next;
ListNode * dummyHead = new ListNode();
dummyHead->next = head;
pre->next = nullptr;// 注意反转后最后一个节点
while(p){
pre = p;
p = p->next;
pre->next = dummyHead->next;
dummyHead->next = pre;
}
head = dummyHead->next;
delete dummyHead;
return head;
}
时间复杂度:O(n)
空间复杂度:O(1)
参考文档
- https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html
- https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html
- https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html