开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入: head = [1,2,3,4]
输出: [1,4,2,3]
示例 2:
输入: head = [1,2,3,4,5]
输出: [1,5,2,4,3]
提示:
- 链表的长度范围为
[1, 5 * 104] 1 <= node.val <= 1000
二、思路分析
reference binding to misaligned address 0xbebebebebebec0b6 for type 'ListNode',which requires 8 byte alignaent (stl_deque. h)0xbebebebebebec0b6: note: pointer points here*
该错误表示堆栈溢出,当堆栈为空时,使用stk.top()并不为空而是为-1,因此在判定栈是否为空时可以用stk.size()>1来进行判断。
遇到这个题,我首先想到了栈,创建一个栈,把结点都存进去,那么取出来的第一个结点就是Ln,后面再清逻辑就行了。不过这个过程真的很烧脑。
我还犯了两个错,一个是上面的堆栈溢出,另一个是在修改了链表中结点的next后,最后一个结点的next忘了给NULL,导致不停地报错,我也迷茫了很久,看别人的解法流程才明白错在了哪里。
别人有的是创建了一个数组容器去做的,因为有序号,我感觉过程麻烦一点,但逻辑上更容易让人理解。
三、AC代码
class Solution {
public:
void reorderList(ListNode* head) {
ListNode* p=new ListNode();
ListNode* q=new ListNode();
p=head->next;
stack<ListNode*>stk;
while(p!=NULL){
stk.push(p);
p=p->next;
}
p=head;
if (head == nullptr||stk.size()<=1) {
return;
}
while(p!=q&&stk.size()>1){
q=stk.top();
q->next=p->next;
p->next=q;
p=q->next;
stk.pop();
}
p->next=NULL;
}
};
提交排名
四、总结
这是为数不多我自己有思路且能实现并做出来的题目,值得纪念,说明还是有进步的!