LeetCode | Swap Nodes in Pairs

100 篇文章 0 订阅
13 篇文章 0 订阅

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

For example, 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.

于是我们尝试优雅地写代码
一开始是这样的

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==NULL || head->next==NULL) return head;
        ListNode root(-1);
        root.next=head;
        //三指针
        ListNode* pre=&root,*t1=pre->next,*t2=t1->next;

        while(t2!=NULL){
            //交换
            pre->next=t2;
            t1->next=t2->next;
            t2->next=t1;

            //一开始这部分是这样写的
            pre=pre->next->next;
            if(pre==NULL){
                break;
            }
            else if(pre->next==NULL){
                break;
            }
            else if(pre->next->next==NULL){
                break;
            }
            else{
                t1=pre->next;
                t2=t1->next;
            }

            //然后感觉这样写太挫了改成了这样
            if(pre!=NULL && pre->next!=NULL && pre->next->next!=NULL){
                t1=pre->next;
                t2=t1->next;
            }
            else break;
            //嗯...优雅了不少
        }
        return root.next;
    }
};

在大神的教导之下,写出了如下代码

//三指针
ListNode* pre=&root;

while(pre!=NULL && pre->next!=NULL && pre->next->next!=NULL){
    //我们只在内部使用到了t1、t2所以只在内部声明它
    ListNode* t1=pre->next;
    ListNode* t2=pre->next->next;

    //交换
    pre->next=t2;
    t1->next=t2->next;
    t2->next=t1;

    pre=pre->next->next;
}

可以看到,最后一份代码如论是从可读性上和可理解性上来说都比之前好得多。
而如何可以写出如上代码,总结下来,1是经验,2是不要急于敲代码,而是在纸上演算和推理一下,待自己对整个算法有个整体把握之后再写。久而久之,就会成为一种习惯
看了一下答案,它是将整个循环变成一个for循环

for(ListNode* pre=&root;pre!=NULL && pre->next!=NULL && pre->next->next!=NULL;pre=pre->next->next)

可以看到这样更加精炼,所以写代码的时候还是需要多思考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值