• 力扣题解 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;
          }
      }
      
  • 相关阅读:
    DataItem 的使用[转帖]
    xmpp协议阅读总结
    smart pointer shared_from_this的使用
    std IO库, stringstream, 简看1
    const成员函数, const member function
    enum 随笔
    分隔和截断字符串, boost string algorithm library中的split和trim
    C++中异常处理
    boost::thread中的锁
    函数对象function object 以及boost::bind的一点了解
  • 原文地址:https://www.cnblogs.com/fromneptune/p/13274688.html
Copyright © 2020-2023  润新知