文章目录
题目
思路
/*
- 思路:
- 如果这是数组的话,相信大多数人都会做,
- 但是本题是链表,,没办法从尾节点向前遍历,
- 所以利用一个栈的pop到pos里面,实现从后往前遍历,
- 并且用一个从前往后的指针pre和 pos相互呼应,
- 只要pre 与 pos不重合 并且 pre.next != pos ,就把pos插在pre的前面
- */
代码及注释
class Solution {
/*
* 思路:
* 如果这是数组的话,相信大多数人都会做,
* 但是本题是链表,,没办法从尾节点向前遍历,
* 所以利用一个栈的pop到pos里面,实现从后往前遍历,
* 并且用一个从前往后的指针pre和 pos相互呼应,
* 只要pre 与 pos不重合 并且 pre.next != pos ,就把pos插在pre的前面
* */
public void reorderList(ListNode head) {
Stack<ListNode> stack = new Stack<>();
if(head == null || head.next == null ){
return;
}
ListNode work = head;
while(work != null) { // 将结点入栈
stack.add(work);
work = work.next;
}
ListNode pre = head; // 从前往后
ListNode pos = stack.pop();//从后往前
while( pre != pos && pre.next != pos){ // 只要pre 和 pos 不重合,并且 pre.next != pos 就把pos插到pre的前面
ListNode tem = pre.next;
pos.next = pre.next;
pre.next = pos;
pre =tem;
pos = stack.pop();
}
pos.next = null; // 注意要切断尾部的next域,避免形成环形链表
}
}