5_7鏈表的k逆序

有一個(gè)單鏈表,請(qǐng)?jiān)O(shè)計(jì)一個(gè)算法,使得每K個(gè)節(jié)點(diǎn)之間逆序,如果最后不夠K個(gè)節(jié)點(diǎn)一組,則不調(diào)整最后幾個(gè)節(jié)點(diǎn)。例如鏈表1->2->3->4->5->6->7->8->null,K=3這個(gè)例子。調(diào)整后為,3->2->1->6->5->4->7->8->null。因?yàn)镵==3,所以每三個(gè)節(jié)點(diǎn)之間逆序,但其中的7,8不調(diào)整,因?yàn)橹挥袃蓚€(gè)節(jié)點(diǎn)不夠一組。

給定一個(gè)單鏈表的頭指針head,同時(shí)給定K值,返回逆序后的鏈表的頭指針。

/*
   struct ListNode {
   int val;
   struct ListNode *next;
   ListNode(int x) : val(x), next(NULL) {}
   };*/
class KInverse {
    public:
        ListNode* inverse(ListNode* head, int k) {
            // write code here
            int cnt = 1;
            ListNode *first = head, *curr = head, *next_gp = head,
                     *local_curr = head, *pre_end = head, *local_pre=head, *local_nxt = head;
            while(curr){
                if(k == cnt){
                    // 記錄第一段需要反轉(zhuǎn)的段前和段后
                    head = curr;
                    next_gp = curr->next;
                    local_pre = next_gp;
                    // 反轉(zhuǎn)內(nèi)部節(jié)點(diǎn)
                    while(local_curr != next_gp){
                        local_nxt = local_curr->next;
                        local_curr->next = local_pre;
                        local_pre = local_curr;
                        local_curr = local_nxt;
                    }
                    // 為下次做準(zhǔn)備
                    curr = first;
                    first = next_gp;
                    pre_end = curr;
                }else if(cnt > k && 0 == cnt%k){
                    // 記錄段前和段后,并將收尾相連
                    pre_end->next = curr;
                    next_gp = curr->next;
                    local_pre = next_gp;
                    local_curr = first;
                    // 反轉(zhuǎn)內(nèi)部節(jié)點(diǎn)
                    while(local_curr != next_gp){
                        local_nxt = local_curr->next;
                        local_curr->next = local_pre;
                        local_pre = local_curr;
                        local_curr = local_nxt;
                    }
                    // 為下次做準(zhǔn)備
                    curr = first;
                    first = next_gp;
                    pre_end = curr;
                }
                curr = curr->next;
                ++cnt;
            }
            return head;
        }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容