首页 > 其他 > 详细

LeetCode-24. Swap Nodes in Pairs

时间:2018-01-17 15:24:24      阅读:204      评论:0      收藏:0      [点我收藏+]

一、问题描述

  给定一个链表,要求换他们的一对值,要求空间复杂度是常量,不能更改链表节点的值,只能更改指针。

  例子:给定一个链表,如1->2->3->4,应该返回2->1->4->3。

二、问题解决

  看到题目大概都能明白怎么去解,关键是如何转化成简单的代码描述。复习一定看一看代码,代码中,为了减去判断头节点是否空、整个链表是否为空使用了一种简单的描述方式,可以学习:

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

  下面是整个代码,使用了指向指针的指针来解决这个问题。还可以方式第一次交换时第一个节点没有前结点的问题(这个问题还可以参考21题新建一个头节点的解决方案)

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;
}

int main()
{
    ListNode node1(1);
    ListNode node2(2);
    ListNode node3(3);
    ListNode node4(4);
    ListNode* list1 = &node1;
    node1.next = &node2;
    node2.next = &node3;
    node3.next = &node4;

    ListNode* ii = swapPairs(list1);
    while (ii != NULL) {
        cout << ii->val << endl;
        ii = ii->next;
    }

    system("pause");
    return 0;
}

  下面是不使用指向指针的指针,而是新建一个头节点的解决方式(同样,在代码中判断下两个节点是否都存在,使用while条件的语句简化):

ListNode* swapPairs(ListNode* head) {
    ListNode f(-1);
    f.next = head;
    ListNode *p = &f;
    ListNode *a = head;
    ListNode *b;
    while (a && a->next) {
        b = a->next;
        a->next = b->next;
        b->next = a;
        p->next = b;
        p = a;
        a = p->next;
    }
    return f.next;
}

 

LeetCode-24. Swap Nodes in Pairs

原文:https://www.cnblogs.com/likaiming/p/8302823.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!