zoukankan      html  css  js  c++  java
  • leecode-143.重排列表(链表,指针)

    题目链接:https://leetcode-cn.com/problems/reorder-list/

    题解:

    方法一:利用vector存放链表,使用双指针进行重排

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode() : val(0), next(nullptr) {}
     7  *     ListNode(int x) : val(x), next(nullptr) {}
     8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     9  * };
    10  */
    11 class Solution {
    12 public:
    13     void reorderList(ListNode* head) {
    14         if (head == nullptr) {
    15             return;
    16         }
    17         vector <ListNode*> res;
    18         ListNode * node = head;
    19         while (node != nullptr) {
    20             res.push_back(node);
    21             node = node->next;
    22         }
    23         int i = 0, j = res.size() - 1;
    24         while (i < j) {
    25             res[i]->next = res[j];
    26             i++;
    27             if (i == j)
    28                 break;
    29             res[j]->next = res[i];
    30             j--;
    31         }
    32         res[i]->next = nullptr;
    33     }
    34 };

    方法二:使用双向队列(还没学,待补)

    方法三:将链表从中间分为俩部分,然后将后半部分逆转,最后将俩部分进行合并

    /** 查找中间指针的方法,使用俩个指针,快指针每次移动俩个位置,慢指针每次移动一个位置,当快指针到达尾部时,慢指针正好到达了中间位置

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode() : val(0), next(nullptr) {}
     7  *     ListNode(int x) : val(x), next(nullptr) {}
     8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     9  * };
    10  */
    11 class Solution {
    12 public:
    13     void reorderList(ListNode* head) {
    14         ListNode * leftList = head;//左半部分
    15         ListNode * rightList = getMidNode(head);//右半部分
    16         ListNode * leftlast = rightList;//左半部分末尾节点
    17         rightList = reverseList(rightList);//右半部分逆序操作
    18         //依次左半部分、右半部分取节点
    19         ListNode * left = leftList;
    20         ListNode * right = rightList;
    21         ListNode * temp = new ListNode(0);
    22         while( left != leftlast || right != nullptr )
    23         {
    24             if( left != leftlast )
    25             {
    26                 temp->next = left;
    27                 temp = temp->next;
    28                 left = left->next;
    29             }
    30             if( right != nullptr )
    31             {
    32                 temp->next = right;
    33                 temp = temp->next;
    34                 right = right->next;
    35             }   
    36         }
    37         head = temp->next;
    38     }
    39     //双指针获取链表中间节点
    40     ListNode* getMidNode(ListNode* head)
    41     {
    42         ListNode * fast = head;
    43         ListNode * slow = head;
    44         while(fast && fast->next)
    45         {
    46             fast = fast->next;
    47             fast = fast->next;//快指针一次走两步
    48             slow = slow->next;//慢指针一次走一步
    49         }
    50         return slow;
    51     }
    52     //链表的逆序操作
    53     ListNode *  reverseList(ListNode* head)
    54     {
    55         ListNode * prenode = nullptr;//前个节点
    56         ListNode * node = head;//当前节点
    57         ListNode * nextnode = head;//下个节点
    58         while( node )
    59         {
    60             nextnode = node->next;//保存下个节点
    61             node->next = prenode; //当前节点连到上个节点
    62             prenode = node;//更新上个节点
    63             node = nextnode ;//更新当前节点
    64         }
    65         return prenode;
    66     }
    67 };
    68 
    69 
    70 作者:li-zhi-chao-4
    71 链接:https://leetcode-cn.com/problems/reorder-list/solution/lian-biao-de-zhong-jian-jie-dian-ni-xu-he-bing-by-/
    72 来源:力扣(LeetCode)
    73 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    View Code
  • 相关阅读:
    联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
    联想 Z5S(L78071)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.370
    联想 Z5(L78011) 免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.254
    联想 S5 Pro(L78041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.123
    第二阶段 冲刺八
    第二阶段 冲刺七
    第二阶段 冲刺六
    第二阶段 冲刺五
    代码大全阅读笔记03
    学习进度十二
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/13848130.html
Copyright © 2011-2022 走看看