zoukankan      html  css  js  c++  java
  • 143. 重排链表

    给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
    将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

    你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

    示例 1:

    给定链表 1->2->3->4, 重新排列为 1->4->2->3.
    示例 2:

    给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/reorder-list
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    快慢指针找到链表中点,将前后部分断开,后半部分反转,然后依次插入前半部分

    //快慢指针找链表中点,slow就是链表中点
            ListNode* slow = head;
            ListNode* fast = head;
            while (fast->next && fast->next->next){
                slow = slow->next;
                fast = fast->next->next;
            }
    
        ListNode* reverseList(ListNode* head) {
            ListNode* ret = nullptr;
            while (head){
                ListNode* next = head->next;
                head->next = ret;
                ret = head;
                head = next;
            }
            return ret;
        }
    
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        void reorderList(ListNode* head) {
            if (!head || !head->next) {
                return;
            }
    
            //快慢指针找链表中点,slow就是链表中点
            ListNode* slow = head;
            ListNode* fast = head;
            while (fast->next && fast->next->next){
                slow = slow->next;
                fast = fast->next->next;
            }
    
            //后半部分头节点
            ListNode* later = slow->next; 
            //断开前后部分
            slow->next = nullptr;
            //反转后半部分
            later = reverseList(later);
    
    
            ListNode* front = head;
            while (front && later) {
                ListNode* frontNext = front->next;
                ListNode* laterNext = later->next;
                front->next = later;
                later->next = frontNext;
                front = frontNext;
                later = laterNext;
            }
        }
    
        //反转链表
        ListNode* reverseList(ListNode* head) {
            ListNode* ret = nullptr;
            while (head){
                ListNode* next = head->next;
                head->next = ret;
                ret = head;
                head = next;
            }
            return ret;
        }
    };
    
  • 相关阅读:
    动态表单之数据分页
    SQL Server 批量生成bcp命令
    SQL Server 全文索引的硬伤
    简单实用SQL脚本Part2:日期和时间函数
    使用SQL Server 扩展函数进行性能优化
    留念2010年5月5日
    C#获取URL参数值
    SQL Server扩展函数的基本概念
    SQL Server 空间换时间的数据库设计
    简单实用SQL脚本Part:查找SQL Server 自增ID值不连续记录
  • 原文地址:https://www.cnblogs.com/xgbt/p/13846255.html
Copyright © 2011-2022 走看看