LeetCode 206. Reverse Linked List *****三指针 (pre,cur,next)

来源:互联网 发布:如果希特勒赢了 知乎 编辑:程序博客网 时间:2024/06/10 13:15

    • 题目
      • 题意
      • 注意
      • 思路
      • 递归实现

题目

Reverse a singly linked list.

题意

反转一个单链表
e.g:
1->2->3->4->5->NULL
NULL<-1<-2<-3<-4<-5

注意

链表的题目一般不允许修改链表内的内容,只能修改指向

思路

需要三个指针,分别保存之前,当前,之后的信息。
1.更改cur的next指向
2.之后pre移动到cur的位置,cur移动到next的位置,next移动到cur的next

这里写图片描述

/** * 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 = NULL;        ListNode* cur = head;        //ListNode* next = cur->next; //对于链表访问的某个域,保证不为空        //这样是危险的。当head为空的情况下        //只有当cur存在的情况下才求取next        while(cur != NULL)        {            ListNode* next = cur->next;            cur->next = pre;            pre = cur;            cur = next;            //next = cur->next;        }        //退出循环之后,cur一定是指向NULL的,pre指向以前链表中的最后一个元素        return pre;    }};

这里写图片描述\

递归实现

class Solution {public:    ListNode* reverseList(ListNode* head) {        if(head == NULL)            return NULL;        if(head->next == NULL)            return head;        ListNode* node = reverseList(head->next);        head->next->next = head;        head->next = NULL;        return node;    }};