zoukankan      html  css  js  c++  java
  • 两两交换链表中的节点(力扣第24题)

    题目:

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

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

    示例:

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

    分析:

      一个链表中,两两相邻的节点交换顺序,也就是将原始链表中的节点,从左往右两两分成一组,然后在各自的组内进行顺序的置换。解决此问题的办法就是借助几个辅助的指针变量,每个组每个组的从左向右的交换,其中为了能够返回正确顺序的结果链表,需要一个头结点用于连接链表中实际的第一个节点。具体的过程如下图所示:

      总结一下,具体的操作公式:

                ListNode l1 = p.next;
                ListNode l2 = p.next.next;
                ListNode l3 = l2.next;
    
                l1.next = l3;
                l2.next = l1;
                p.next = l2;
    
                p = l1;

      代码实现如下:

    public ListNode swapPairs(ListNode head) {
    
            if (head == null || head.next == null){
                return head;
            }
            ListNode node = new ListNode(-1);
            node.next = head;
            ListNode p = node;
    
            while (p.next != null && p.next.next != null){
    
                ListNode l1 = p.next;
                ListNode l2 = p.next.next;
                ListNode l3 = l2.next;
    
                l1.next = l3;
                l2.next = l1;
                p.next = l2;
    
                p = l1;
            }
    
            return node.next;
        }

     注意,像l1、l2、l3这样的临时变量,必须每次遍历时重新声明定义,就比如l1,它将自己的地址每次赋值给了p,p存放的是l1的地址,间接指向了l1当前指向的节点,如果不重新定义l1,那么当l1被直接赋予新的值时,p也会随之改变指向的元素。

  • 相关阅读:
    [IDA] 显示反汇编字节码
    使用OD手动去除花指令的一个小技巧
    [CrackMe]一个简单算法的CrackMe
    [IDA] 将ANSI字符串转换为Unicode字符串
    二进制中的数学换算
    GDT表与段描述符
    C#3.0新增功能10 表达式树 04 执行表达式
    C#3.0新增功能10 表达式树 03 支持表达式树的框架类型
    C#3.0新增功能10 表达式树 02 说明
    C#3.0新增功能10 表达式树 01 简介
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13378839.html
Copyright © 2011-2022 走看看