zoukankan      html  css  js  c++  java
  • 力扣题解 206th 反转链表

    206th 反转链表

    • 三指针法/迭代

      • 原理:把后一个元素的next指针指向前一个元素。
      • 为什么要引入三个指针:
        • Previous指针:用来记录前一个元素,mid指针将指向它。
        • Mid指针:用来记录当前需要修改next指针的那个元素,在previous指针的前一位,previous指针在修改完毕后将指向它。
        • Next指针:指向链表剩余部分的第一个元素,mid指针在修改完毕后将指向它,在mid指针的前一位。
      /**
       * Definition for singly-linked list.
       * public class ListNode {
       *     int val;
       *     ListNode next;
       *     ListNode(int x) { val = x; }
       * }
       */
      class Solution {
          public ListNode reverseList(ListNode head) {
              ListNode previous = null;
              ListNode mid = head;
      
              while(mid != null) {
                  ListNode next = mid.next;
                  mid.next = previous;
                  previous = mid;
                  mid = next;
              }
      
              return previous;
          }
      }
      
    • 递归

      递归的写法根据三指针迭代法修改而来,递归循环的变量是三指针中的next指针(递归看起来是正着走过去的与遍历相同,但递归是反过来时才开始执行的,我们可以利用此特性实现链表的间歇性反转),其他两个指针被head.next.next = head抵消。

      /**
       * 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;
              ListNode p = reverseList(head.next);
      
              head.next.next = head;
              head.next = null;
      
              return p;
          }
      }
      
  • 相关阅读:
    安卓学习第12课——SimpleAdapter
    用栈结构实现多项式计算器
    用B-树实现虚拟图书管理系统
    HDU4791【杂】
    HDU4801【DFS】
    萌新学习图的强连通(Tarjan算法)笔记
    Lightoj 1021【状压DP(未搞)】
    Lightoj 1008【规律】
    CodeForces Canada Cup 2016【A,B,C,D】
    51nod 1068【简单博弈】
  • 原文地址:https://www.cnblogs.com/fromneptune/p/13274688.html
Copyright © 2011-2022 走看看