力扣24题——两两交换链表中的节点

1.题目描述
2.1解决方法
2.2完整代码
3.小节

1.题目描述:

力扣24题
在这里插入图片描述

2.1解决方法:

图一:
图一
根据题目内容可知:我们需要在链表中两两调换节点的位置,因此我们需要定义一个虚拟节点指向头结点(即链表的第一个节点),并且定义一个当前指针指向虚拟头结点,从而便于获取头结点的位置

图二:
在这里插入图片描述
如上图二所示,从头结点开始两两交换节点之间的位置,但是交换之前,我们需要定义一个临时节点temp先将头结点1的位置进行保存,然后当前指针指向节点2,节点2的指针指向节点1(即temp),如果没有保存的话,那么当虚拟头结点的指针指向节点2时,我们就找不到节点1的位置了

当链表中节点个数为奇数时:
例如图二:如果3,4节点完成位置交换后,当前指针就位于3位置,因此我们只需要判断当前指针所处位置下的节点的下下一个节点是否为空即可,即判断3节点的下下一个节点是否为空,如图可知:3节点的下一个节点为5节点,5节点后面为空,所有不再交换

图三:
在这里插入图片描述
当链表中节点个数为偶数时:
刚好两两交换完全,我们只需要判断当前节点的下下一个节点是否为空即可
例如图三:如果5,6节点完成交换后,当前指针就位于5位置,我们指向要判断节点5后面的是不是空就可以了,如图可知:5节点后为空,所有不再交换

2.2完整代码:

/**
 * 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) {
        ListNode dummyhead = new ListNode(-1,head); // 设置一个虚拟头结点并指向头结点
        ListNode cur = dummyhead;
        ListNode temp; // 临时节点,保存两个节点后面的节点
        ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点
        ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点
        while (cur.next != null && cur.next.next != null) {
            temp = cur.next.next.next;
            firstnode = cur.next;
            secondnode = cur.next.next;
            cur.next = secondnode;       // 步骤一
            secondnode.next = firstnode; // 步骤二
            firstnode.next = temp;      // 步骤三
            cur = firstnode; // cur移动,准备下一轮交换
        }
        return dummyhead.next; 
    }
}

3.小节:

著此篇,与君享,互勉之,共进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值