暴力解
遍历链表将元素存入一个vector,然后翻转(reverse)vector或者使用反向迭代器,将元素新建一个链表接上去返回就可以了,不过这样大量使用了额外空间及操作。
双指针迭代
参考,里面的作者有动图,很容易理解。
记住更改next指针的时候要防止后面元素丢失
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *cur = NULL;
auto pre = head;
while(pre != NULL){
auto p = pre->next;
pre->next = cur;
cur = pre;
pre = p;
}
return cur;
}
};
递归法
参考链接,递归很难形象地解释,这位同学的幻灯片做地很到位。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == NULL || head->next == NULL){
return head;
}
// cur每次返回的都是同一结点(尾结点)
auto cur = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return cur;
}
};