143. 重排链表(一般)

给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:

给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

将原链表转成数组类型,顺序读取,前后指针,一起取数

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public void reorderList(ListNode head) {
//题意理解错误
//应该需要引入新链表,逆序的
if(head==null){
return;
}

//将链表转成数组存储,然后前后双指针一起遍历
List<ListNode> list = new ArrayList<>();
ListNode cur = head;
while(cur!=null){
list.add(cur);
cur = cur.next;
}
int left = 0,right = list.size()-1;
while(left<right){
//先前再后
list.get(left).next = list.get(right);
left++;
if(left==right){
break;
}
list.get(right).next = list.get(left);
right--;
}
list.get(left).next = null;
}
}