0024-两两交换链表中的节点

两两交换链表中的节点

方案一


需要建立dummy节点,注意在连接节点的时候

借助单链表实现

C-源代码


/**
 两两交换链表中的节点 1->2->3->4
 
 @param head 不带头结点
 @return 交换之后的链表 2->1->4->3
 */
struct ListNode *swapPairs(struct ListNode *head)
{
    struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode));
    struct ListNode *prev = dummy;
    prev->next = head;
    
    while (prev->next != NULL && prev->next->next != NULL) {
        
        struct ListNode *a = prev->next;
        struct ListNode *b = prev->next->next;
        
        struct ListNode *temp = b->next;
        prev->next = b;
        b->next = a;
        a->next = temp;
        prev = a;
    }
    
    return dummy->next;
}

/**
 两两交换链表中的节点测试
 */
void test_0024(void)
{
    int arr[4] = { 1, 2, 3, 4 };
    struct ListNode *head = linkListCreateHead(arr, sizeof(arr) / sizeof(arr[0]));

    printf("========两两交换链表中的节点测试========\n");
    
    printNode(head);
    struct ListNode *new = swapPairs(head->next);
    printNode(new);
}

方案二


利用了回溯的思想,递归遍历到链表末尾,然后先交换末尾两个,然后依次往前交换

借助单链表实现

C-源代码


struct ListNode *swapPairs2(struct ListNode *head)
{
    if (!head || !head->next) {
        
        return head;
    }
    
    struct ListNode *temp = head->next;
    head->next = swapPairs(head->next->next);
    temp->next = head;
    
    return temp;
}

参考Grandyang

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,484评论 0 13
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,083评论 6 13
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,216评论 2 89
  • 办假证的效率比真证要快多了,但终究是假的。下面说说我今天办真证的苦逼过程! 给小孩办体检本。跨区办理的苦逼流程如下...
    旅行和阳光阅读 3,203评论 0 0
  • 2月5号到2月8号,我参加了宏亮体育俱乐部举行的黄河杯比赛 ,我和队友仝博宇获得了团体冠军,这次比赛有五...
    素馨花薛皓中阅读 3,911评论 0 0

友情链接更多精彩内容