当你的才华还撑不起你的野心时,你应该静下心去学习 。
题目描述
非常经典的一道手撕代码题(不过目前K个一组翻转会更多,但都是要掌握的),输入一个链表,反转链表后,输出新链表的表头。
输入:{1,2,3}
输出:{3,2,1}
解题思路
迭代:
假设存在链表 1→2→3→∅,我们想要把它改成 ∅←1←2←3。
在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。
递归: 递归版本稍微复杂一些,其关键在于反向工作。假设列表的其余部分已经被反转,现在我们应该如何反转它前面的部分?
假设列表为:
若从节点 nk+1 到 nm 已经被反转,而我们正处于 nk
我们希望 nk+1 的下一个节点指向 nk。所以,nk.next.next = nk。
参考代码 Java版本class Solution {
//递归
public ListNode reverseList(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null; //避免成环
return newHead;
}
}
/***迭代
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode nex = null;
while(head!=null){
nex = head.next;
head.next = pre;
pre = head;
head = nex;
}
return pre;
}
****/
// 关注TechGuide,大厂笔经面经闪电速递!
CPP版本
class Solution {
public:
// 递归
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newHead;
}
}
/***迭代
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
}
***/
// 关注TechGuide,大厂笔经面经闪电速递!
创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧👍