• 链表:反转链表


    题目:实现反转单向和双向链表的函数

    要求:如果链表长度为N,时间复杂度要求为 O(N),额外空间复杂度为 O(1)

    变形:给定一个单向链表的头结点head,以及两个整数 from 和 to,在单向链表上把第 from 个节点到 to 个节点这一部分进行反转

    分析:本题很简单,解题时注意做到不出错即可

    主要掌握链表中反转链表的常规操作

     1 //单链表
     2 public class Node
     3 {
     4     public int data;
     5     public Node next;
     6 
     7     public Node(int data)
     8     {
     9         this.data = data;
    10     }
    11 }
    12 
    13 public Node reverse(Node head)
    14 {
    15     if(head == null || head.next == null)
    16         return head;
    17 
    18     Node pre = null, next = null;
    19 
    20     while(head != null)
    21     {
    22         next = head.next;
    23         head.next = pre;
    24         pre = head;
    25         head = next;
    26     }
    27 
    28     return pre;
    29 }
     1 //双链表
     2 public class DoubleNode
     3 {
     4     public int value;
     5     public DoubleNode next;
     6     public DoubleNode pre;
     7 
     8     public DoubleNode(int value)
     9     {
    10         this.vaule = value;
    11     }
    12 }
    13 
    14 public DoubleNode reverse(DoubleNode head)
    15 {
    16     if(head == null || head.next == null)
    17         return head;
    18 
    19     DoubleNode pre = null, next = null;
    20 
    21     while(head != null)
    22     {
    23         next = head.next;
    24         head.next = pre;
    25         head.pre = next;
    26         pre = head;
    27         head = next;
    28     }
    29 
    30     return pre;
    31 }

    变形题目分析:

    1. 首先需要判断 1<=from<=to<=N,如果不满足,则直接返回原来的头结点。

    2. 找到第 from-1 个节点 fPre 和第 to+1 个节点 tPos。即发展前一个节点和后一个节点,把反转的部分先反转,然后正确连接 fPre 和 tPos。

    3. 如果 fPre 为 null,则说明反转部分包含头节点,则返回新的头结点,也就是 to 位置的节点;如果不为null,返回旧的头节点。

     1 public Node reverse(Node head, int from, int to)
     2 {
     3     Node cur = head, fPre = null, tPos = null;
     4     int len = 0;
     5     while(cur != null)
     6     {
     7         len++;
     8         fPre = len == from - 1 ? cur : fPre;
     9         tPos = len == to + 1 ? cur : tPos;
    10         cur = cur.next;
    11     }
    12 
    13     if(from > to || from < 1 || to > len)
    14         return head;
    15 
    16     Node pre = fPre == null ? head : fPre.next;
    17     Node cur = pre.next;
    18     pre.next = tPos;
    19     Node next = null;
    20     while(cur != tPos)
    21     {
    22         next = cur.next;
    23         cur.next = pre;
    24         pre = cur;
    25         cur = next;
    26     }
    27     
    28     if(fPre != null)
    29     {
    30         pre.next = fPre;
    31         return head;
    32     }
    33 
    34     return pre;
    35 }

    参考资料:程序员代码面试指南 IT名企算法与数据结构题目最优解,左程云

  • 相关阅读:
    python中的map,fliter,reduce用法
    python中的函数参数传递
    python中的全局变量和局部变量
    python中的函数定义
    python中的eval()和exec()函数
    kafka手动提交,丢失数据
    02-基本概念
    01-接触kafka
    (8)适配模式--结构性
    java内存划分
  • 原文地址:https://www.cnblogs.com/2015110615L/p/6659905.html
Copyright © 2020-2023  润新知