【2024考研】题解11 | #链表的奇偶重排#
链表的奇偶重排
https://www.nowcoder.com/practice/02bf49ea45cd486daa031614f9bd6fc3
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ ListNode* oddEvenList(ListNode* head) { // write code here //特例存在一方空表或者单位表,直接输出 if(head == NULL || head->next == NULL){ return head; } //奇偶数节点表头 ListNode *oddhead = head; ListNode *oddtail = oddhead; //奇偶数节点表尾 ListNode *evenhead = head->next; ListNode *eventail = evenhead; //以偶数为基准,双跨连接,奇动偶再动 while (eventail != NULL && eventail->next != NULL) { oddtail->next = eventail->next; oddtail = oddtail->next; eventail->next = oddtail->next; eventail = oddtail->next; } //最后奇数节点尾连上偶数节点头 oddtail->next = evenhead; //输出奇数在前 return oddhead; } };
基本算法思想
①该算法首先判断链表是否为空或只有一个节点,
②如果是,则直接返回原链表。然后创建两个指针oddHead
和evenHead
,分别指向奇数位节点的头节点和偶数位节点的头节点。
同时创建两个指针oddTail
和evenTail
,分别指向奇数位节点和偶数位节点的尾节点。
③然后使用一个循环,将奇数位节点和偶数位节点分别连接起来,直到遍历完整个链表。
④最后将奇数位节点的尾节点指向偶数位节点的头节点,并返回奇数位节点的头节点。
时空复杂度
该算法的时间复杂度为O(n),其中n是链表的长度。算法遍历了整个链表一次。
空间复杂度为O(1),只使用了常数级别的额外空间。
2024考研数据结构 文章被收录于专栏
本人考研刷算法题,立此专栏练习强化。