剑指 Offer 24. 反转链表
程序员文章站
2022-03-11 17:23:24
...
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一。
我也不知道当时咋想的,新创建了一个链表,使用了前插给他创建的,将头节点指向的当前节点插入到新链表的头节点,哈
/**
* 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 *h = NULL;
while(head!=NULL){
ListNode *t = new ListNode(head->val);
t->next = h;
h = t;
head = head->next;
}
return h;
}
};
方法二:
双指针,其实和上面那个差不多,只是这个原节点,没有创建新节点
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==NULL)
return NULL;
ListNode *cur = NULL,*pre = head;
while(pre!=NULL){
ListNode *t = pre->next;
pre->next = cur;
cur = pre;
pre = t;
}
return cur;
}
};
方法三:递归
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==NULL || head->next == NULL){
return head;
}
ListNode *ret = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return ret;
}
};
ret是反转后的头节点,head->next-.next = head这一步就是反转