1 题目描述
将给定的单链表
L
:
L
0
→
L
1
→
.
.
.
→
L
n
−
1
→
L
n
L: L_0 \rightarrow L_1 \rightarrow ... \rightarrow L_{n-1} \rightarrow L_n
L:L0→L1→...→Ln−1→Ln
重新排序为
L
:
L
0
→
L
n
→
L
1
→
L
n
−
1
→
L
2
→
L
n
−
2
→
.
.
.
L: L_0 \rightarrow L_n \rightarrow L_1 \rightarrow L_{n-1} \rightarrow L_2 \rightarrow L_{n-2} \rightarrow ...
L:L0→Ln→L1→Ln−1→L2→Ln−2→...
要求使用原地算法,不能改变节点内部的值,需要对实际的节点进行交换。
例如:
对于给定的单链表{1, 2, 3, 4},将其重新排序为{1, 4, 2, 3}.
2 解题思路
2.1 知识补充
原地算法
在计算机科学中,一个原地算法(in-place algorithm)基本上不需要额外辅助的数据结构,然而,允许少量额外的辅助变量来转换数据的算法.
2.2 解题思路
- 寻找倒数第二个结点
- 利用倒数第二个结点,将第一个结点的next赋给倒数第一个结点(准确地说,是当前正在处理的结点)
- 将倒数第一个结点赋给第一个节点的next
- 将倒数第二个节点的next改为null
- 将当前结点向后移动两个结点的位置
3 代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode *head) {
if(head == NULL || head->next == NULL || head->next->next == NULL) return;
ListNode* currNode = head;
ListNode* lastButOneNode;
while(currNode != NULL && currNode->next != NULL && currNode->next->next != NULL){
lastButOneNode = currNode;
while(lastButOneNode->next->next != NULL)
lastButOneNode = lastButOneNode->next;
lastButOneNode->next->next = currNode->next;
currNode->next = lastButOneNode->next;
lastButOneNode->next = NULL;
currNode = currNode->next->next;
}
}
};
4 运行结果
运行时间: 208ms
占用内存: 1784KB