鏈表每k個(gè)元素翻轉(zhuǎn)

原始鏈表:0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> NULL
k = 2:1 -> 0 -> 3 -> 2 -> 5 -> 4 -> 7 -> 6 -> 9 -> 8 -> NULL
k = 3:2 -> 1 -> 0 -> 5 -> 4 -> 3 -> 8 -> 7 -> 6 -> 9 -> NULL

#include <iostream>
#include <stdlib.h>

using namespace std;

struct link_node {
    int i;
    link_node *next;
};

//標(biāo)準(zhǔn)鏈表翻轉(zhuǎn)
link_node * reverse(link_node * head) {
    if (head == NULL) {
        return NULL;
    }

    link_node *p = head->next;
    head->next = NULL;
    while (p != NULL) {
            link_node *q = p->next;
            p->next = head;
            head = p;
            p = q;
    }

    return head;
}

/* 更簡(jiǎn)潔
link_node * reverse(LinkNode *head)
{
        link_node *pre = NULL;

        while (head != NULL)
        {
                link_node *p = head->next;
                head->next = pre;
                pre = head;
                head = p;
        }

        return pre;
}
*/

//鏈表每k個(gè)元素翻轉(zhuǎn)
link_node *reverse_k(link_node * head, int k) {
    link_node *p = head;
    link_node *last_tail = NULL; 
    link_node *new_head = NULL;

    while (p != NULL) {
        //截取鏈表的k個(gè)元素
        link_node *q = p;
        for (int i=0; i<k-1; ++i) {
            if (q == NULL) break;
            q = q->next;
        }

        //如果沒有到鏈表尾部,用tmp記錄鏈表的剩余部分
        link_node *tmp = NULL;
        if (q != NULL) {
            tmp = q->next;
            q->next = NULL;  //將k個(gè)元素的鏈表末尾指向NULL,形成一個(gè)新鏈表,以便進(jìn)行標(biāo)準(zhǔn)鏈表翻轉(zhuǎn)
        }

        link_node *h = reverse(p);  //翻轉(zhuǎn)后,h為新鏈表頭,p為新鏈表尾

        if (p == head) new_head = h;  //第一批k個(gè)元素翻轉(zhuǎn)后的頭是最終鏈表的頭
        else last_tail->next = h;           //其余每k元素鏈表的頭接到上批k元素鏈表的尾

        last_tail = p;  //記錄上批k元素鏈表的尾
        p = tmp;        //移到鏈表剩余部分開始處理下批k
    }

    return new_head;
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        cerr << "Usage: " << argv[0] << " k" << endl;
        return -1;
    }
    link_node *head = new(link_node);
    head->i = 0;
    link_node *p = head;
    for (int i=1; i<10; ++i) {
        link_node *tmp = new(link_node);
        tmp->i = i;
        p->next = tmp;
        p = p->next;
    }
    p->next = NULL;

    cout << "src link" << endl;
    p = head;
    while (p!= NULL) {
        cout << p->i << " -> ";
        p = p->next;
    }
    cout << "NULL" << endl;

    cout << "new link" << endl;
    link_node *head2 = reverse_k(head, atoi(argv[1]));
    p = head2;
    while (p!= NULL) {
        cout << p->i << " -> ";
        p = p->next;
    }
    cout << "NULL" << endl;

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容