LeetCode算法学习(10)

本文探讨了如何在链表中交换每一对相邻节点的问题,提供了详细的思路分析和关键代码实现,强调了算法应仅使用常数额外空间,并且不修改节点值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Swap Nodes in Pairs
Given a linked list, swap every two adjacent nodes and return its head.

Example:

Given 1->2->3->4, you should return the list as 2->1->4->3.

Note:

Your algorithm should use only constant extra space.
You may not modify the values in the list’s nodes, only nodes itself may be changed.

题目大意

对相邻的链表结点进行交换。

思路分析

链表题,关键在于处理好指针的变化;可以通过画图来找到思路。这题的关键在于交换完结点后的后续指针应该指向哪里。通过分析,可以得到两种情况:一种是后面还有不止两个结点,另一种是后面只有一个或零个结点。处理好这个关系就能很快的解决这道问题。

关键代码

    ListNode* swapPairs(ListNode* head) {
        bool flag = true;
        if (head == NULL) return head;
        ListNode *p = head, *q = head->next;
        if (p == NULL || q == NULL) return head;
        ListNode *result = head->next;
        ListNode *temp = q->next;
        while (p != NULL && q != NULL) {
            if (flag) {
                q->next = p;
                if (temp && temp->next)
                    p->next = temp->next;
                else
                    p->next = temp;
            } else {
                p = temp;
                if (p) q = p->next;
                if (q) temp = q->next;
            }
            flag = !flag;
        }
        return result;
    }

总结

链表复习2,需要冷静下来,画个图就出来的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值