题目:
Reverse a singly linked list.
题意:
题目只有一句话,反转一个单链表,给一个单向链表,将链表反转。
那道题目后,一时没想到效率很高的办法,隔了一天后再做,突然想到可以用递归,在交换两个节点之前,先把后面节点进行交换,最主要的递归式是:
void Reverse(ListNode* a, ListNode* b) {
Reverse(b, b->next);
b->next = a;
}
在 此基础上进行优化和情况判断,当最后一位时,需要进行记录新的头结点,所以可以利用全局变量,另外,原来的首节点的next应指向NULL,加上这两个情况,可得出函数:
class Solution {
public:
ListNode *Head;
void Reverse(ListNode* a, ListNode* b) {
if (b->next == NULL) {
Head = b;
}
else {
Reverse(b, b->next);
}
b->next = a;
}
ListNode* reverseList(ListNode* head) {
if (head && head->next) {
Reverse(head, head->next);
head->next = NULL;
return Head;
}
return head;
}
};