奇偶链表
实例要求
- 1、给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表;
- 2、第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推;
- 3、注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致;
- 4、必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题;
- 示例:
实例分析
- 1、对输入的链表进行了边界检查,如果链表为空或者只有一个节点,则直接返回原链表;
- 2、初始化四个指针,oddHead指向奇数索引链表的头节点,evenHead指向偶数索引链表的头节点,oddPtr和evenPtr分别指向当前奇数索引链表和偶数索引链表的末尾节点;
- 3、使用while循环遍历链表,每次循环将奇数索引节点的下一个节点连接到奇数索引链表的末尾,然后将奇数索引指针移动到刚刚添加的节点;
- 4、将偶数索引节点的下一个节点连接到偶数索引链表的末尾,然后将偶数索引指针移动到刚刚添加的节点;
- 5、将奇数索引链表的尾部连接到偶数索引链表的头部,形成最终的链表;
- 6、返回奇数索引链表的头部,作为重新排序后的链表;
示例代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* oddEvenList(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
// 分别初始化奇数索引链表和偶数索引链表的头节点
struct ListNode *oddHead = head;
struct ListNode *evenHead = head->next;
struct ListNode *oddPtr = oddHead;
struct ListNode *evenPtr = evenHead;
// 遍历链表,将奇数索引节点和偶数索引节点分别连接起来
while (evenPtr != NULL && evenPtr->next != NULL) {
oddPtr->next = evenPtr->next;
oddPtr = oddPtr->next;
evenPtr->next = oddPtr->next;
evenPtr = evenPtr->next;
}
// 将奇数索引链表的尾部连接到偶数索引链表的头部,形成最终的链表
oddPtr->next = evenHead;
return oddHead;
}
运行结果