zoukankan      html  css  js  c++  java
  • 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;
    	}
    }
  • 相关阅读:
    Exp7 网络欺诈防范
    Exp6 信息搜集与漏洞扫描
    Exp4 恶意代码分析
    Exp2 后门原理与实践
    PC平台逆向破解实验报告
    See You Again——我最后的汇编程序
    表格标签
    ansible环境搭建
    OSPF_1
    Linux的文件管理(8-27)
  • 原文地址:https://www.cnblogs.com/ysw-go/p/11890496.html
Copyright © 2011-2022 走看看