问题描述:
给定一个链表,将其倒序排列,例如输入1->2->3->4,输出4->3->2->1。链表结点的定义如下,
struct ListNode {
int val;
ListNode *next;
ListNode(int x): val(x), next(NULL) {}
};
问题分析:
链表倒序的高效算法时间复杂度为O(n),空间复杂度为O(1)。其基本思想是将后面的结点一个个移动到前方,例如对输入 1->2->3->4 的处理步骤是 (1) 2->1->3->4 (2) 3->2->1->4 (3) 4->3->2->1
C++ 代码:
// 对(prev, next)之间的元素进行倒序排列,双开区间
ListNode *reverseList(ListNode *prev, ListNode *next) {
ListNode *last = prev->next;
ListNode *cur = last->next;
while(cur != next) {
last->next = cur->next;
cur->next = prev->next;
prev->next = cur;
cur = last->next;
}
return prev->next;
}
// 对整个链表进行倒序排列
ListNode *reverseList(ListNode *head) {
if (head == NULL) return head;
ListNode dummy(0);
dummy.next = head;
return reverseList(&dummy, NULL);
}