题目链接
思路:
将链表一分为二,对半切开后,将后半部分的链表进行翻转,翻转过后,对这两个部分的链表从头开始遍历,并进行拼接,拼接时,第一部分的链表的每一个节点后面都需要拼接一个第二部分的链表
例子:
原始链表
1->2->3->4->5
对半切开后,得到
1->2->3
4->5
对后半部分进行翻转
1->2->3
5->4
最后,进行拼接合并
1->2->3 -> 1->5->2->4->3
5->4
代码:
public void reorderList(ListNode head) {
if (head == null || head.next == null || head.next.next == null) {
return ;
}
int len = 0;
ListNode cur = head;
// 得到链表的总长度
while (cur != null) {
len++;
cur = cur.next;
}
// 对链表进行对半切分
int pos = len / 2 + 1;
cur = head;
while (--pos > 0) {
cur = cur.next;
}
// 拿到后一部分的头节点
ListNode cutNode = cur.next;
// 与原始链表进行断链
cur.next = null;
// 翻转后一部分的链表
ListNode cutHead = reverse(cutNode);
cur = head;
// 拼接
while (cur != null && cutHead != null) {
ListNode next = cur.next;
ListNode cutNext = cutHead.next;
cur.next = cutHead;
cutHead.next = next;
cur = next;
cutHead = cutNext;
}
}
// 对链表进行翻转
private ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}