【算法分析与设计】交换两个节点

       📝个人主页五敷有你      
 🔥系列专栏算法分析与设计
⛺️稳中求进,晒太阳

题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

 示例

示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

思路


这里我们需要三个指针,p,q,temp。
假设链表是
1->2->3->4->5->6
在迭代的时候,每次处理两个节点,于是第一轮 p指向 1,q 指向 2。
第二轮的时候 p 指向 3,q 指向 4。第三轮的时候 p 指向 5,q 指向 6。
我们通过 a.next = b.next,以及b.next=a就把两个指针的位置反转了,于是1->2就变成2->1。
但这里有一个细节需要处理,当我们第二轮迭代的时候,p 指向 3,q 指向 4。按照题目要求,最终应该是2->1->4->3。
也就是节点 1 需要跟节点 4 串起来,只有两个指针就没法弄了,所以需要第三个指针 tmp,用来记录上一轮 p 的位置,然后下一轮迭代的时候,将原先的 p(也就是节点 1)指向 4。

1.初始化:

申请一个节点,方便后续操作。

2.  p指向1 q指向2

3.  tmp.next = b;  a.next = b.next; (操作过程中不要丢失节点)

现在节点的顺序是2 1 3 4 

 不好看,那我转一下(是不是清晰多了) ,一次调换两个节点

 4. 接下来 temp和p q指向 1 ,来操作后两个节点,

代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head==null){
            return null;
        }
        ListNode pre=new ListNode(-1);
        ListNode p=pre;
        ListNode q=pre;
        
        pre.next=head;
        ListNode temp=pre;
        while(q!=null&&q.next!=null&&q.next.next!=null){

            
            p=p.next;
            q=q.next.next;

            temp.next=q;
            p.next=q.next;
            q.next=p;


            temp=p;
            q=p;
        }
        return pre.next;
    }
}

运行结果

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-03 01:34:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-03 01:34:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-03 01:34:02       87 阅读
  4. Python语言-面向对象

    2024-02-03 01:34:02       96 阅读

热门阅读

  1. ubuntu安装redis记录

    2024-02-03 01:34:02       63 阅读
  2. QT 加载 mysql 驱动

    2024-02-03 01:34:02       57 阅读
  3. 【笔记】SPN和PLMN 运营商网络名称显示

    2024-02-03 01:34:02       120 阅读
  4. <网络安全>《13 上网行为管理》

    2024-02-03 01:34:02       55 阅读
  5. SpringCloud引入父项目需要注意的地方

    2024-02-03 01:34:02       53 阅读
  6. Vite 官方文档速通

    2024-02-03 01:34:02       74 阅读
  7. 七、测试计划(软件工程)

    2024-02-03 01:34:02       50 阅读
  8. Hook 技术 相关的博客链接(还有一些其他的)

    2024-02-03 01:34:02       60 阅读
  9. 组播目的地址

    2024-02-03 01:34:02       54 阅读