题目描述:
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解析:
1.判断链表的个数,如果小于等于2,直接返回即可
2.利用快慢指针找到中间节点,将链表分为前后链表
3.定义一个函数,逆转中间节点后面的链表
4.将逆转后的链表插入到前面的链表
Java:
public void reorderList(ListNode head) {
if(head == null || head.next == null || head.next.next == null) {
return;
}
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
ListNode newHead = slow.next;
slow.next = null;
newHead = reverseList(newHead);
while(newHead != null) {
ListNode temp = newHead.next;
newHead.next = head.next;
head.next = newHead;
head = newHead.next;
newHead = temp;
}
}
private ListNode reverseList(ListNode head) {
if(head == null) {
return null;
}
ListNode curr = head;
head = head.next;
curr.next = null;
while(head != null) {
ListNode temp = head.next;
head.next = curr;
curr = head;
head = temp;
}
return curr;
}JavaScript:
var reorderList = function(head) {
if(head === null || head.next === null || head.next.next === null) {
return;
}
let slow = head;
let fast = head;
while(fast !== null && fast.next !== null) {
slow = slow.next;
fast = fast.next.next;
}
let newHead = slow.next;
slow.next = null;
newHead = reverseList(newHead);
while(newHead !== null) {
const temp = newHead.next;
newHead.next = head.next;
head.next = newHead;
head = newHead.next;
newHead = temp;
}
function reverseList(head) {
if(head === null) {
return null;
}
let curr = head;
head = head.next;
curr.next = null;
while(head !== null) {
const temp = head.next;
head.next = curr;
curr = head;
head = temp;
}
return curr;
}
};
京公网安备 11010502036488号