Swap Nodes in Pairs leetcode

本文介绍了一种链表中相邻节点的交换算法,并提供两种不同的实现方式:一种使用三个临时指针的传统方法;另一种则是更为巧妙的双重指针法,后者在代码简洁性和效率上都更胜一筹。

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.

 

Subscribe to see which companies asked this question

 
未优化的代码,用3个临时指针
ListNode* swapPairs(ListNode* head) {
    if (head == nullptr || head->next == nullptr)
        return head;
    ListNode *pre = head;
    ListNode *cur = pre->next;
    ListNode *net = cur->next;
    head = cur;
    while (true)
    {
        cur->next = pre;
        if (net == nullptr || net->next == nullptr) {
            pre->next = net;
            break;
        }        
        pre->next = net->next;
        pre = net;
        cur = pre->next;        
        net = cur->next;    
    }
    return head;
}

 

惊人的解法,用双重指针,开阔思路,本以为自己可以随心所欲使用双指针,看来还是差得远

ListNode *swapPairs(ListNode *head) {
    ListNode **p = &head;

    while (*p && (*p)->next) {
        ListNode *t = (*p)->next;

        (*p)->next = t->next;
        t->next = *p;
        *p = t;

        p = &(*p)->next->next;
    }

    return head;
}

 

转载于:https://www.cnblogs.com/sdlwlxf/p/5122770.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值