题目:
思路:
这道题有点麻烦。
首先先找到这个链表的中点(快慢指针同时走,快指针走到尽头的时候,慢指针正好是链表的中点)
然后拆分成两个链表,把第二个链表反转
最后是在按要求把这两个链表接上
package 剑指offer;
public class t26重排链表 {
//把链表拆分成两段
public void reorderList(ListNode head) {
//哨兵节点
ListNode dummy = new ListNode(0);
dummy.next = head;
//快慢指针
ListNode fast = dummy;
ListNode slow = dummy;
//遍历
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next;
if (fast.next != null) {
fast = fast.next;
}
}
//遍历到最后,fast值指向链表的最后一个节点
//low指针指向链表的中间那个节点
ListNode temp = slow.next;
slow.next = null;
//链接起来
link(head, reverseList(temp), dummy);
}
//联系链表的操作
private void link(ListNode node1, ListNode node2, ListNode head) {
ListNode prev = head;
while (node1 != null && node2 != null) {
//先储存起node1的下一个节点
//之所以需要先把node1的下一个节点储存,是因为node1接在node2后,无法再执行node1=node1.next
ListNode temp = node1.next;
prev.next = node1;
node1.next = node2;
prev = node2;
node1 = temp;
node2 = node2.next;
}
if (node1 != null) {
prev.next = node1;
}
}
private ListNode reverseList(ListNode first) {
ListNode prev = null;
ListNode cur = first;
ListNode head = null;
while (cur != null) {
ListNode next = cur.next;
cur.next = prev;
if (next == null) {
head = cur;
}
prev = cur;
cur = next;
}
return head;
}
}