逍遥自在,云水遨游。.|

climerecho

园龄:4年4个月粉丝:177关注:22

2021-10-20 17:39阅读: 133评论: 0推荐: 0

LeetCode->链表反转

 

这是一个很基础的题目。今天处理了一下,不论是以双指针迭代、递归等方法,都能处理,但是也使这个题目更为典型。

剑指 Offer 24. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)

https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/fan-zhuan-lian-biao-yi-dong-de-shuang-zhi-zhen-jia/790541

00 题目

 

 

 

提示:

  • 链表中节点的数目范围是 [0, 5000]

  • -5000 <= Node.val <= 5000

01 双指针(迭代)

01-0 思路

  1. 定义两个指针: cop 和 temp ;cop 在前 temp在后。

  2. 每次让 cop 的 next 指向 temp ,实现一次局部反转

  3. 局部反转完成之后, cop 和 temp 同时往前移动一个位置

  4. 循环上述过程,直至 cop 到达链表尾部

img

01-1 代码

复制代码
 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode() : val(0), next(nullptr) {}
 7  *     ListNode(int x) : val(x), next(nullptr) {}
 8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 9  * };
10  */
11 class Solution {
12 public:
13     ListNode* reverseList(ListNode* head) {
14         ListNode *re=NULL,*cop=head;
15         while(cop!=NULL){
16             ListNode *temp = cop->next;
17             cop->next = re;
18 19             re = cop;
20             cop = temp;
21         }
22         return re;
23     }
24 };
复制代码

 

02 递归

02-0 思路

总体思想是利用递归函数的函数栈来实现栈的特性。

img

  1. 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 ret.

  2. 此后,每次函数在返回的过程中,让当前结点的下一个结点的 next 指针指向当前节点。

  3. 同时让当前结点的 next 指针指向 NULL ,从而实现从链表尾部开始的局部反转

  4. 当递归函数全部出栈后,链表反转完成。

02-1 代码

复制代码
 1 class Solution {
 2 public:
 3     ListNode* reverseList(ListNode* head) {
 4         if (head == NULL || head->next == NULL) {
 5             return head;
 6         }
 7         ListNode* ret = reverseList(head->next);
 8         head->next->next = head;
 9         head->next = NULL;
10         return ret;
11     }
12 };
复制代码

 

03 强化双指针

03-0 思路

  1. 原链表的头结点就是反转之后链表的尾结点,使用 head标记 .

  2. 定义指针 cur,初始化为 head .

  3. 每次都让 head 下一个结点的 next 指向 cur ,实现一次局部反转

  4. 局部反转完成之后,cur 和 head 的 next 指针同时 往前移动一个位置

  5. 循环上述过程,直至 cur 到达链表的最后一个结点 .

img

03-1 代码

复制代码
 1 class Solution {
 2 public:
 3     ListNode* reverseList(ListNode* head) {
 4         if (head == NULL) { return NULL; }
 5         ListNode* cur = head;
 6         while (head->next != NULL) {
 7             ListNode* t = head->next->next;
 8             head->next->next = cur;
 9             cur = head->next;
10             head->next = t;
11         }
12         return cur;
13     }
14 };
复制代码

 

 

 

本文作者:climerecho

本文链接:https://www.cnblogs.com/Roboduster/p/15429918.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   climerecho  阅读(133)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 尚好的青春 孙燕姿
  2. 2 孙燕姿
  3. 3 克卜勒 孙燕姿
克卜勒 - 孙燕姿
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.