自学内容网 自学内容网

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

力扣《反转链表》系列文章目录

刷题次序,由易到难,一次刷通!!!

题目题解
206. 反转链表反转链表的全部 题解1
92. 反转链表 II反转链表的指定段 题解2
24. 两两交换链表中的节点两个一组反转链表
25. K 个一组翻转链表K 个一组反转题解3

一、题目

在这里插入图片描述

二、解题思路

对于反转指定段的链表,都采用将所需要反转的这一段单独摘出来,先记录好这段的上一个节点和下一个节点。将需要反转的部分反转好之后,再将其正确链接回原链表,参照下图。
在这里插入图片描述
创建一个哑节点(dummy node),它的next指向头节点,这样可以简化边界条件的处理。接着,使用一个while循环来遍历链表,采用两个每次循环交换一对相邻的节点。最后,返回哑节点的next,即交换后的链表的头节点。
注意:对 cur 进行赋值前,必须检验 pre 是否为 null,不是 null 才可以对 cur 进行赋值。

三、代码

/**
 * 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 dummy = new ListNode(0, head);// 创建一个哑节点(dummy node),它的next指向头节点,这样可以简化边界条件的处理
        ListNode ppre = dummy;
        ListNode pre = dummy.next;
        if (pre == null) {
            return head;
        }
        ListNode cur = pre.next;
        while (cur != null) {
            ListNode nxt = cur.next;// 保存“下一个节点”
            cur.next = pre;// 反转
            pre.next = nxt;// 连回原链表的“下一个节点”
            ppre.next = cur;// 连回原链表的“上一个节点”
            ppre = pre;
            pre = pre.next;
            if (pre == null) {
                break;
            } else {
                cur = pre.next;
            }
        }
        return dummy.next;
    }
}

原文地址:https://blog.csdn.net/J_pluto/article/details/142433451

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!