本周题目难度"Medium",碎片化的时间加起来,我大概用了三个小时吧,还是看财务学习视频的时候突然有了想法(学习的效率多低,唉。。。)
题目:给你一个单链表,要求你将链表相临的两个节点交换后返回。即第一个节点和第二个节点交换,第三个节点和第四个节点交换。。。要是最后剩了一个奇数节点就不用换了
思路:这题还需要思路么?就两两交换,小学生都会,只是代码实现就比较纠结了,所以直接来看代码吧(效率一般):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head) {
//如果给的是空链,直接返回
if (head == NULL) return head;
//若是单节点链表,也直接返回
if (head->next == NULL) return head;
//将第二个节点作为新头部
struct ListNode* newHead = head->next;
struct ListNode* result = newHead;
//将原头节点的下一个节点指向原第三个节点
head->next = head->next->next;
//将新节点的第二个节点置为原头节点,至此,头节点和第二个节点就交换完成了
result->next = head;
//移动到第二个节点处
result = result->next;
//如果第三个节点不为空(为了方便注释,我就按第一次执行来说)
while(result->next != NULL) {
//如果第四个节点不为空
if (result->next->next != NULL) {
//记录第三个节点
struct ListNode* temp1 = result->next;
//将第四个节点置为新的第三个节点
result->next = result->next->next;
//移到下一个节点
result = result->next;
//记录第五个节点(是NULL也无所谓)
struct ListNode* temp2 = result->next;
//将第四个节点置为原第三个节点
result->next = temp1;
//移到下一个节点
result = result->next;
//拼接第五个节点,至此,第三个和第四个节点交换完成
result->next = temp2;
//如果没有第四个节点(最后一个是奇数节点),直接返回
}else return newHead;
}
return newHead;
}
方法有很多,我写的还是比较low的,小伙伴可以开动大脑,多写几种。