奇偶链表
实例要求
- 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;
}
运行结果