LeetCode 24. Swap Nodes in Pairs 解题报告

LeetCode 24. Swap Nodes in Pairs 解题报告

题目描述

Given a linked list, swap every two adjacent nodes and return its head.


示例

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


注意事项

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


解题思路

我的思路:

这道题是考链表的更改操作,没什么难度,细心一些就好。整个过程就是从头开始,对于每一对需要交换的节点,按顺序调整节点的next指针,使其指向正确的节点。由于头指针也是需要交换的,所以我的算法中用了一个小技巧,就是另外设置了一个辅助头结点指向链表的头结点,这样就可以对整个链表进行处理。每次调整时,我都是利用前一个节点的指针和第一个待交换的节点指针进行交换操作,具体过程如下图:
process
在纸上演算一下就能知道调整的顺序应该是怎样的,只要细心一些就能很快Accept。

参考思路:

大神们的解法都是中规中矩地两两节点交换,不过不同的是代码的简洁程度。他们写的好简练。见下面的参考代码进行参考学习。


代码

我的代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode *newHead = new ListNode(0);
        newHead->next = head;

        ListNode *pre = newHead, *first;
        while (pre) {
            if (!pre->next || !pre->next->next)
                break;

            first = pre->next;
            pre->next = first->next;
            first->next = first->next->next;
            pre->next->next = first;
            pre = first;
        }

        return newHead->next;
    }
};

参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode **pp = &head, *a, *b;

        while ((a = *pp) && (b = a->next)) {
            a->next = b->next;
            b->next = a;
            *pp = b;
            pp = &(a->next);
        }

        return head;
    }
};

总结

这道题就是水题(我承认我偷懒了),链表的指针操作都是很基础的东西,只要指针的操作顺序弄懂,基本就能做出来。从其他人的代码里学到了一些小技巧,比如巧用计算的结果进行条件判断(当然要注意=跟==的区别,不能乱用)。
早上完成这学期最后一门课的展示,终于上完了大学里所有的课程,接下来就是实习,找工作跟完成毕设了,要加油啦,朝着自己的梦想奋斗!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值