题目链接:
解题思路 [借助栈实现]:
- 题目的意图是想要重组链表, 按照[头]->[尾]->[头]->[尾]...的方式重新排列;
- 因为为单向链表, 不能从尾部逆序推出前一个节点;
- 所以比较容易想到的是借助栈的'FILO'的特性, 逐步倒序取出尾部节点重新拼接链表;
- 如果借助链表实现, 则需要重点考虑的问题是, 重组链表的过程中, 再何时需要停止:
- 重组的停止条件设定: 当前序遍历的当前节点或者当前节点的后节点与逆序遍历的当前节点相同时, 即可退出重组循环
- 注意: 如果是前序遍历的当前节点的后节点与后续遍历的当前节点相同时, 需要将先序遍历的curr指针后移一位, 直接退出, 防止链表节点为偶数个时, 先序/后序交错而过, 导致的重复添加节点的异常.
实现代码(java) [栈]:
class Solution {
public void reorderList(ListNode head) {
//借助栈实现
Stack<ListNode> stack = new Stack<>();
ListNode putNode = head;
while(putNode != null){ //节点入栈
stack.push(putNode);
putNode=putNode.next;
}
//链表重排
ListNode curr = head;
while(!stack.isEmpty()){
ListNode sNode = stack.pop();
if(curr == sNode){ //循环退出条件
break;
}
if(curr.next == sNode){
curr = curr.next;
break;
}
//尾节点插入到当前节点与下一个节点中间
sNode.next = curr.next;
curr.next = sNode;
//移动前序遍历当前节点指针
curr = curr.next.next;
}
curr.next = null; //断除尾节点后的无效节点
}
}
提交记录[20210624]:
执行用时:3 ms, 在所有 Java 提交中击败了41.04%的用户
内存消耗:41 MB, 在所有 Java 提交中击败了58.73%的用户