题目
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路
单单用列表来做,需要不停的遍历,去获取最后一个节点。
那有没有办法,不用这样呢?所以就想到了数组,数组是直接可以通过下标来获取节点的。
1,将链表节点都加入到数组中
2,用两个指针,一个从头部开始向后,一个从尾部开始向前。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
if (head==null){
return;
}
ArrayList<ListNode> list = new ArrayList<ListNode>();
ListNode root = head;
while (root!=null){
list.add(root);
root = root.next;
}
int i=0;
int j=list.size()-1;
while ( i<j && i!=j){
list.get(i).next = list.get(j);
i++;
list.get(j).next = list.get(i);
j--;
}
list.get(i).next = null;
}
}