问题详见:Reverse Linked List
题目是要求将链表反转,下面是给定的链表结点结构:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
解题思路:
因为链表的结构使得其不能逆向遍历,所以我们可以考虑构造一个新的链表,然后不断插入正向遍历原链表的每个节点即完成链表的反转。具体C++算法如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL;
while (head) {
ListNode* next = head -> next;
head -> next = pre;
pre = head;
head = next;
}
return pre;
}
};
其提交运行结果如下:
当然我们发现该链表的反转和我们的递归算法思想很像,所以能自然而然想到利用递归将其反转。下面是利用递归思想的C++解题算法:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !(head -> next)) return head;
ListNode* node = reverseList(head -> next);
head -> next -> next = head;
head -> next = NULL;
return node;
}
};
其提交运行结果如下:
由上可知两种算法的复杂度均为 O(n) ,但是相对而言递归调用时间花费较大。