从小白到高手|链表|两两交换链表中的节点

题目链接

力扣题目链接

题目内容

在这里插入图片描述

解题分析

1、要操作一个节点A,就需要知道这个节点的地址,这个节点的地址也就是它前一个结点的指针域的值。
2、如果要进行两个节点地址的交换,和交换两个基本类型的值类似,可以构建临时变量用来存放值。
3、要操作第一个节点,可以构建一个虚拟头节点,指向第一个节点1,如果把虚拟头节点的指向从1改成2,再把2的指向从3改成1,那这样就完成了1和2两个节点的交换。
4、在交换过程中,需要先把1的地址和3的地址放到变量中保存,否则会丢失。1和3的地址分别是他们前一个节点的指向。
5、构建一个当前操作的节点,从虚拟头节点开始操作,操作完后两个节点的交换后,操作节点应该移到下下个节点,准备进行下一次操作。
6、如果当前操作节点的指向是空,说明当前位于链表的末端,停止操作;如果当前操作节点的下下个节点是空,说明当前操作节点无法进行交换的操作,也应该停止。

代码实现

/**
 * 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 {
    /**
    分析:变更链表中某个节点的顺序,实际上是操作这个节点的前一个节点中指针域的指向
    思路:先构造一个虚拟的头节点virHead,指针域内容为当前链表的第一个节点,把虚拟头节点的指针域内容换成2的,再把2的指针域内容换成1的指针,就完成了一次1和2的交换
        在交换之前先用一个临时的节点保存1的指向
     */
    public ListNode swapPairs(ListNode head) {
        //创建虚拟头节点,指向实际头节点
        ListNode virHead = new ListNode(0,head);
        //当前操作的节点,从虚拟头节点开始
        ListNode currentNode = virHead;
        //用来临时存放指针地址
        ListNode tempNode = new ListNode();
        //用来临时存放指针地址
        ListNode tempNode1 = new ListNode();

        while(currentNode.next!=null&&currentNode.next.next!=null){
            //循环条件,当前操作操作节点的下一个节点为空,说明节点总数是偶数,达到终止条件,
            //如果下下个节点为空看,说明节点总数是奇数,不满足两两交换的条件,达到终止条件
            
            //先把当前节点指向的下一个节点地址保存起来
            tempNode = currentNode.next;
            //把当前节点的下下个节点指向的地址保存起来
            tempNode1 = currentNode.next.next.next;


             //把当前节点的指向换成下下个节点的地址
            currentNode.next = currentNode.next.next;

            //把下个节点的指向换成保存的地址
            currentNode.next.next = tempNode;
            //把下下个节点的指向换成保存的地址
            currentNode.next.next.next = tempNode1;
           

            //把操作节点的地址换成当前节点的下下个节点地址
            currentNode = currentNode.next.next;
        }
        //最后返回实际的头节点
        return virHead.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值