美文网首页
【LeetCode】24.两两交换链表中的节点(Swap Nod

【LeetCode】24.两两交换链表中的节点(Swap Nod

作者: 仍有不归期 | 来源:发表于2020-06-14 00:36 被阅读0次

简书内代码已上传GitHub:点击我 去GitHub查看代码
点击 这里 跳转到LeetCode官网查看题目
点击 这里 跳转到LeetCode中国官网查看题目

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

You may not modify the values in the list's nodes, only nodes itself may be changed.

Example:

Given 1->2->3->4, you should return the list as 2->1->4->3.

中文:

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

思路:

这道题要注意两点

  • 给定的链表可能是空表
  • 给定的链表节点数可能是奇数个

理解以上两点后写起来就不难啦,对链表进行遍历,步长为二。每次遍历交换节点,并连接左节点的前驱和右节点的后继.并在只剩单节点或链尾跳出循环。

Accept by C:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* swapPairs(struct ListNode* head){
    struct ListNode* p , *pre, *result;
    //如果是空链表或单节点,直接返回。
    if(!head || !(head ->next)){
        return head;
    }else
        //返回链表的头节点为第二个节点
        result = head -> next;
    //存储前一个节点
    pre = NULL;
    //遍历
    while(head){
        //剩余单独节点,跳出循环
        if(head -> next == NULL)
            break;
        //交换
        p = head -> next;
        head -> next = p -> next;
        p -> next = head;
        //除了首元,其余元素都有前一个节点(偶数节点)
        if(pre) pre -> next = p;
        //交换后与前一个节点接上
        pre = head;
        //向前遍历
        head = head -> next;
        
    }
    return result;
}


AC

每天进步一点,加油!


End

END

相关文章

网友评论

      本文标题:【LeetCode】24.两两交换链表中的节点(Swap Nod

      本文链接:https://www.haomeiwen.com/subject/yqipzhtx.html