24.两两交换链表中的节点

03-29 4879阅读 0评论

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

24.两两交换链表中的节点 第1张

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

思路:迭代

创建虚拟头结点list,令list->next=head。令pre表示当前到达的节点,

初始时 pre= list。每次需要交换 pre后面的两个节点。

如果 pre的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 pre 后面的两个节点 cur和 later,通过更新节点的指针关系实现两两交换节点。

具体而言,交换之前的节点关系是 pre -> cur -> later,交换之后的节点关系要变成 pre -> later-> cur,因此需要进行如下操作

cur->next=later->next;

later->next=cur;

pre->next=later;

完成上述操作之后,节点关系即变成 pre -> cur -> later。再令 pre = cur,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。

两两交换链表中的节点之后,新的链表的头节点是 list->next,返回新的链表的头节点即可。

24.两两交换链表中的节点 第2张

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* swapPairs(struct ListNode* head) {
    struct ListNode* list=malloc(sizeof(struct ListNode));
    list->next=head;
    struct ListNode* pre;
    pre=list;
    while(pre->next!=NULL&&pre->next->next!=NULL)
    {
        struct ListNode* cur=pre->next;
        struct ListNode* later=pre->next->next;
        cur->next=later->next;
        later->next=cur;
        pre->next=later;
        pre=cur;
    }
    return list->next;
}

免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,4879人围观)

还没有评论,来说两句吧...

目录[+]