• 交换链表中的节点-24-25


    • 两两交换链表中的节点-24

    给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

    你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

    示例:

    给定 1->2->3->4, 你应该返回 2->1->4->3.

     1 public class T24 {
     2 
     3     public ListNode swapPairs(ListNode head) {
     4         if (head == null) {
     5             return head;
     6         }
     7         ListNode dummy = new ListNode(-1);
     8         dummy.next = head;
     9         ListNode pre = dummy;
    10 
    11 
    12         while (head != null && head.next != null) {
    13 
    14             ListNode p1 = head;
    15             ListNode p2 = head.next;
    16 
    17             //exchange
    18             pre.next = p2;
    19             p1.next = p2.next;
    20             p2.next = p1;
    21 
    22             //continue
    23             pre = p1;
    24             head = pre.next;
    25 
    26         }
    27         return dummy.next;
    28 
    29     }
    30 }
    •  k个一组反转链表-25

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

    k 是一个正整数,它的值小于或等于链表的长度。

    如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

    示例:

    给你这个链表:1->2->3->4->5

    当 k = 2 时,应当返回: 2->1->4->3->5

    当 k = 3 时,应当返回: 3->2->1->4->5

    说明:

    你的算法只能使用常数的额外空间。
    你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

     1 public class T25 {
     2     public ListNode reverseKGroup(ListNode head, int k) {
     3         ListNode dummy = new ListNode(-1);
     4         dummy.next = head;
     5         ListNode pre = dummy;
     6         ListNode end = dummy;
     7 
     8         while (end.next != null) {
     9             for (int i = 0; i < k && end != null; i++) {
    10                 end = end.next;
    11             }
    12             if (end == null) {
    13                 break;
    14             }
    15             //复制出 start 和 next,即将被覆盖
    16             ListNode start = pre.next;
    17             ListNode next = end.next;
    18             end.next = null;
    19 
    20             //反转 + 前驱节点拼接  start地址不变,但是其next指针更换为null
    21             pre.next = reverse(start);
    22             //end + 后驱节点
    23             start.next = next;
    24 
    25             //更新pre和end
    26             pre = start;
    27             end = pre;
    28 
    29         }
    30         return dummy.next;
    31     }
    32 
    33     private ListNode reverse(ListNode start) {
    34         ListNode dummy = new ListNode(-1);
    35         while (start != null) {
    36             ListNode next = start.next;
    37             start.next = dummy.next;
    38             dummy.next = start;
    39             start = next;
    40         }
    41         return dummy.next;
    42     }
    43 }
    一回生,二回熟
  • 相关阅读:
    docker创建nginx+php-fpm+mysql环境(一分钟搭建lnmp)
    dcoker搭建wordpress
    docker搭建mysql
    nginx负载均衡精简配置实例
    docker配置阿里云镜像加速
    Centos7 ssh配置RSA证书登录
    Dockerfile centos7_php5.6.36
    Dockerfile cnetos7_nginx1.15.10
    Dockerfile centos7_tomcat7.0.64_jdk7u80
    centos7 安装docker
  • 原文地址:https://www.cnblogs.com/zzytxl/p/12507999.html
Copyright © 2020-2023  润新知