【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;
    }
};

基本算法思想

①该算法首先判断链表是否为空或只有一个节点,

②如果是,则直接返回原链表。然后创建两个指针oddHeadevenHead,分别指向奇数位节点的头节点和偶数位节点的头节点。

同时创建两个指针oddTailevenTail,分别指向奇数位节点和偶数位节点的尾节点。

③然后使用一个循环,将奇数位节点和偶数位节点分别连接起来,直到遍历完整个链表。

④最后将奇数位节点的尾节点指向偶数位节点的头节点,并返回奇数位节点的头节点。

时空复杂度

该算法的时间复杂度为O(n),其中n是链表的长度。算法遍历了整个链表一次。

空间复杂度为O(1),只使用了常数级别的额外空间。

2024考研数据结构 文章被收录于专栏

本人考研刷算法题,立此专栏练习强化。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务