LeetCode 24. 两两交换链表中的节点 | C语言版
LeetCode 24. 两两交换链表中的节点
题目描述
题目地址:24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
解题思路
思路一:使用多指针
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head){
//设置一个虚拟头结点(统一操作)
struct ListNode* dummyHead=(struct ListNode*)malloc(sizeof(struct ListNode));
dummyHead->next=head;
//当前节点
struct ListNode* cur=dummyHead;
//dummyHead(cur)->1->2->3->4->NULL
while(cur->next!=NULL && cur->next->next!=NULL){
//临时节点tmp:记录cur的下一个节点(1)
struct ListNode* tmp=cur->next;
//临时节点tmp1:记录cur的下下下一个节点(3)
struct ListNode* tmp1=cur->next->next->next;
//dummyHead(cur)->1(tmp)->2->3(tmp1)->4->NULL
//两两交换操作
//1.将cur的指针域指向cur->next->next(2)
cur->next=cur->next->next;
//2.将cur->next->next(2)和tmp(1)两个节点交换位置
cur->next->next=tmp;
//3.将cur->next->next(1)的指针域指向tmp1(3)
cur->next->next->next=tmp1;
//dummyHead(cur)->2->1(tmp)->3(tmp1)->4->NULL
//cur向右移动两位,准备下一轮交换
cur=cur->next->next;
}
return dummyHead->next;
}
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片