剑指 Offer II 026. 重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
输入: head = [1,2,3,4] 输出: [1,4,2,3]
来源:LeetCode
由于链表的下标不具有利用下标进行索引的功能,所以先将节点的值放入一个线性表里面,然后再构建一个新的链表。
需要注意的点: 1.需要两个指针,一个指向就是从0开始,另外一个指向list中的最后一个元素。 2.链表构建完毕的条件:i和j相等时 3.每次进行链表节点的构建时,进行i++或者j–,移动指针寻找下一个节点的值。 4.当构建完毕之后,链表结尾的指针应该指向null。
class Solution {
public void reorderList(ListNode head) {
List<ListNode> list = new ArrayList<ListNode>();
ListNode node = head;
while(node!=null){
list.add(node);
node=node.next;
}
int i=0,j=list.size()-1;
while(i<j){
list.get(i).next=list.get(j);
i++;
if(i==j)
{break;}
list.get(j).next=list.get(i);
j--;
}
list.get(i).next=null;
}
}
|