题目描述:
给定一个单链表 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.
emm,硬生生的放入list然后遍历
class Solution {
public void reorderList(ListNode head) {
List<ListNode> list = new ArrayList<>();
ListNode tem = head;
while (tem != null) {
list.add(tem);
tem = tem.next;
}
int start = 0;
int end = list.size() - 1;
ListNode temnode = null;
if(list.size() == 0){
return ;
}
while (start < end ) {
ListNode tem1 = list.get(start ++);
ListNode tem2 = list.get(end --);
if(temnode == null){
temnode = tem2;
}else {
temnode.next = tem1;
temnode = tem2;
}
tem1.next = tem2;
tem2.next = null;
}
int size = list.size();
if((size & 1) == 1 && size != 1){
ListNode nod = list.get(start);
nod.next = null;
temnode.next = nod;
}
}
}
效率肯定很低,但是完成了
跟着别人的思路进行一遍
class Solution {
public void reorderList(ListNode head) {
if(head == null || head.next == null){
return ;
}
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null && fast.next.next != null ) {
slow = slow.next;
fast = fast.next.next;
}
// fast在这里就表示第二段的开始节点
fast = slow.next;
// 反转第二段的节点
fast = reverse(fast);
slow.next = null;
// slow表示的是第一段的开始节点
slow = head;
while (slow != null && fast != null) {
ListNode tem1 = slow.next;
ListNode tem2 = fast.next;
slow.next = fast;
fast.next = tem1;
slow = tem1;
fast = tem2;
}
}
public ListNode reverse(ListNode root){
if(root == null){
return null;
}
ListNode node = root;
ListNode pre = null;
while (node.next != null) {
ListNode temNode = node.next;
node.next = pre;
pre = node;
node = temNode;
}
node.next = pre;
return node;
}
}
来源:https://blog.csdn.net/qq_34446716/article/details/99679326