首页 > 其他分享 >反转链表-LeetCode206 改变指向

反转链表-LeetCode206 改变指向

时间:2022-12-02 13:57:26浏览次数:64  
标签:ListNode cur 指向 next 链表 LeetCode206 prev 指针

LeetCode链接:https://leetcode.cn/problems/reverse-linked-list/

题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例1:

      

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例2:

       

输入:head = [1,2]
输出:[2,1]

    相信很多人第一次拿到这种题目跟我一样,想的就是再建立一个空间,但是这样太浪费内存了,有更好的办法解决。

思路

    其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示(来自代码随想录):

      206_反转链表

    之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。

    那么接下来看一看是如何反转的呢?

    首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。

    接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。

java代码如下:

// 双指针
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;
        ListNode temp = null;
        while (cur != null) {
            temp = cur.next;// 保存下一个节点
            cur.next = prev;
            prev = cur;
            cur = temp;
        }
        return prev;
    }
}

 还有一种递归的方法如下:

// 递归 
class Solution {
    public ListNode reverseList(ListNode head) {
        return reverse(null, head);
    }

    private ListNode reverse(ListNode prev, ListNode cur) {
        if (cur == null) {
            return prev;
        }
        ListNode temp = null;
        temp = cur.next;// 先保存下一个节点
        cur.next = prev;// 反转
        // 更新prev、cur位置
        // prev = cur;
        // cur = temp;
        return reverse(cur, temp);
    }
}

    这又是一道双指针的题,不难,只要把之前题弄懂即可!!!

标签:ListNode,cur,指向,next,链表,LeetCode206,prev,指针
From: https://www.cnblogs.com/lzdream/p/16932776.html

相关文章

  • 链表--删除数据
    采用尾插法建立链表typedefstructnode{intage;structnode*next;}link;intmain(){link*head=(link*)malloc(sizeof(link));link*new,*tail;tail=hea......
  • 链表
    1.头插法#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructpeople{intage;structpeople*next;}link;intma......
  • 剑指offer:反转链表
    题目描述输入一个链表,反转链表后,输出链表的所有元素。1.非递归/*structListNode{intval;structListNode*next;ListNode(intx):val(x),......
  • 剑指offer:二叉搜索树与双向链表
    题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。1.递归/*structTreeNode{intval;s......
  • 剑指offer:复杂链表的复制
    题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。/*structRandomListNode{intlabel;structRandom......
  • 删除有序链表中的重复元素(python)
    重复的留下一个def deleteDuplicates(self , head: ListNode) -> ListNode:        # write code here        #空链表        if ......
  • VUE全局this指向
    前言在很久很久之前我还是个菜鸡的时候,解决报错的时候,不幸看过一种关于this指向的写法,当时没记住,只知道有个这么个模糊的概念,然后今天晚上来了灵感,就写出来了,说到这个thi......
  • 链表的奇偶重排
    思路:变成数组操作def oddEvenList(self , head: ListNode) -> ListNode:        # write code here        p = head        num......
  • 单链表的排序(python)
    思路:链表最难受的就是不能按照下标访问,只能逐个遍历,那像排序中常规的快速排序、堆排序都不能用了,只能用依次遍历的冒泡排序、选择排序这些。但是这些O(n2)O(n^2)O(n2)复杂......
  • 单链表每k个一组反转(python)
    题目:将给出的链表中的节点每k 个一组翻转,返回翻转后的链表如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。具体做法......