两两交换链表中的节点--Java版

该博客介绍了一种使用Java实现两两交换链表中相邻节点的方法。通过虚拟头节点和就地逆序的策略,可以方便地调整节点指针,实现节点交换。示例和思路都进行了详细阐述。
摘要由CSDN通过智能技术生成

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:

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

思路:
就地逆序+虚拟头节点。通过调整节点指针域的指向来直接调换相邻的两个节点。如果时偶数个节点,那么将偶数个节点调换;如果是奇数个节点,那么只需要将最后一个节点以外的节点调换即可。对于无头节点的链表可以创建一个虚拟头节点,使任意一个节点都有其前驱节点,便于操作
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        //创建一个虚拟头节点,数据域象征给-1
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode cur = head;//当前遍历的节点
        ListNode pre = dummyNode;//当前节点的前驱节点
        ListNode next = null;//当前节点后继节点的后继节点
        while(cur!=null && cur.next!=null){
            //操作前要先保存后面的节点
            next = cur.next.next;
            //逆序操作
            pre.next = cur.next;
            cur.next.next = cur;
            cur.next = next;
            //指针后移
            pre = cur;
            cur = next;
        }
        return dummyNode.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值