LeetCode 328. 奇偶链表 | C语言版
LeetCode 328. 奇偶链表
题目描述
题目地址:328. 奇偶链表
给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
解题思路
思路一:使用多指针
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* oddEvenList(struct ListNode* head){
//当链表的为空或只有一个节点的时候,直接退出
//if(!head || !head->next) return head;
if(head==NULL || head->next==NULL) return head;
//从前往后遍历整个链表,遍历时维护四个指针
//奇数链表头结点
struct ListNode* oddHead=head;
//奇数链表尾节点
struct ListNode* oddTail=oddHead;
//偶数链表头结点
struct ListNode* evenHead=head->next;
//偶数链表尾节点
struct ListNode* evenTail=evenHead;
//head(oddHead,oddTail)->evenHead,evenTail->p->...
//1.找到奇数链表和偶数链表
//辅助指针p指向链表的第三个节点,用来遍历链表的剩余节点
//或者写作ListNode* p=head->next->next; while(p!=NULL){...}
for(struct ListNode* p=head->next->next;p;){
//奇数链表尾节点oddTail的next指针指向p节点,并后移一位
oddTail->next=p;
oddTail=oddTail->next;
//p指针后移一位
p=p->next;
if(p!=NULL){
//偶数链表尾节点evenTail的next指针指向p节点, 并后移一位
evenTail->next=p;
evenTail=evenTail->next;
//p指针后移一位
p=p->next;
}
//最终我们就将奇偶链表分离开来
}
//2.将奇偶链表合并(奇数链表+偶数链表)
oddTail->next=evenHead;
evenTail->next=NULL;
return oddHead;
}
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片