题目:
Reverse a singly linked list.
click to show more hints.
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?
思路:
1、递归法:如果头结点为空或者链表中只有一个结点,则属于平凡情况,直接返回。否则首先翻转以head->next为头结点的链表,然后把head接在末尾,并将head的next置为空。
2、迭代法:从前往后扫描链表,每次翻转一下next的指向,直到到达链表末尾。最后别忘了将head的next置为空。
代码:
1、递归法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
ListNode *new_tail = head->next;
ListNode *new_head = reverseList(head->next);
new_tail->next = head;
head->next = NULL;
return new_head;
}
};
2、迭代法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == NULL) {
return NULL;
}
ListNode* pre_node = head;
ListNode* crt_node = head->next;
while(crt_node != NULL)
{
ListNode* nxt_node = crt_node->next; // backup
crt_node->next = pre_node;
pre_node = crt_node;
crt_node = nxt_node;
}
head->next = NULL;
return pre_node;
}
};