• Leetcode题目206.反转链表(简单)


    题目描述:

    反转一个单链表。

    示例:
    
    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL
    进阶:
    你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

    思路分析:

    方法一:迭代
    假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3。

    在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!

    代码实现:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public static ListNode reverseList(ListNode head) {
    
            //preNode表示当前节点的前一个节点
            ListNode preNode = null;
            //当前节点curNode
            ListNode curNode = head;
            while (curNode != null) {
                //nextNode,表示当前节点的下一个节点
                ListNode nextNode = curNode.next;
                curNode.next = preNode;
                preNode = curNode;
                curNode = nextNode;
            }
            return preNode;
        }
    }

    时间复杂度:O(n)

    空间复杂度:O(1)

    思路二:递归

    递归的两个条件:

    终止条件是当前节点或者下一个节点==null
    在函数内部,改变节点的指向,也就是head的下一个节点指向head 递归函数那句
    head.next.next = head
    很不好理解,其实就是head的下一个节点指向head。
    递归函数中每次返回的cur其实只最后一个节点,在递归函数内部,改变的是当前节点的指向。
    动画演示如下:

    代码实现:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
       public ListNode reverseList(ListNode head) {
    		//递归终止条件是当前为空,或者下一个节点为空
    		if(head==null || head.next==null) {
    			return head;
    		}
    		//这里的cur就是最后一个节点
    		ListNode cur = reverseList(head.next);
    		//这里请配合动画演示理解
    		//如果链表是 1->2->3->4->5,那么此时的cur就是5
    		//而head是4,head的下一个是5,下下一个是空
    		//所以head.next.next 就是5->4
    		head.next.next = head;
    		//防止链表循环,需要将head.next设置为空
    		head.next = null;
    		//每层递归函数都返回cur,也就是最后一个节点
    		return cur;
    	}
    }
  • 相关阅读:
    SQLServer 高可用、高性能和高保护延伸
    SQLServer 通过DMV实现低影响的自动监控和历史场景追溯
    查找表包含的页和页所在的表
    出身在二三线城市软件工作者的悲哀
    SQL语句实现取消自增列属性
    基于Apache(without ssl)的svn环境搭建
    sqlite3 命令行操作
    HTML常用特殊符号集
    IOS项目目录结构和开发流程
    Mac OSX 快捷键&命令行
  • 原文地址:https://www.cnblogs.com/ysw-go/p/11890496.html
Copyright © 2020-2023  润新知