美團筆試題:k鏈表翻轉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
k鏈表翻轉。給出一個鏈表和一個數k,比如鏈表1→2→3→4→5→6,k=2,
則翻轉後2→1→4→3→6→5,若k=3,翻轉後3→2→1→6→5→4,若k=4,
翻轉後4→3→2→1→5→6,用程序實現。


typedef struct node {
    struct node *next;
    int data;
} node;
void createList(node **head, int data)
{
    node *pre, *cur, *new;
    pre = NULL;
    cur = *head;
    while (cur != NULL) {
        pre = cur;
        cur = cur->next;
    }
    new = (node *)malloc(sizeof(node));
    new->data = data;
    new->next = cur;
    if (pre == NULL)
    *head = new;
    else
    pre->next = new;
}
void printLink(node *head)
{
    while (head->next != NULL) {
        printf("%d ", head->data);
        head = head->next;
    }
    printf("%dn", head->data);
}
int linkLen(node *head)
{
    int len = 0;
    while (head != NULL) {
        len ++;
        head = head->next;
    }
    return len;
}
node* reverseK(node *head, int k)
{
    int i, len, time, now;
    len = linkLen(head);
    if (len < k) {
        return head;
        else {
        time = len / k;
    }
    node *newhead, *prev, *next, *old, *tail;
    for (now = 0, tail = NULL; now < time; now ++) {
        old = head;
        for (i = 0, prev = NULL; i < k; i ++) {
            next = head->next;
            head->next = prev;
            prev = head;
            head = next;
        }
        if (now == 0) {
            newhead = prev;
        }
        old->next = head;
        if (tail != NULL) {
            tail->next = prev;
        }
        tail = old;
    }
    if (head != NULL) {
        tail->next = head;
    }
    return newhead;
}
int main(void)
{
    int i, n, k, data;
    node *head, *newhead;
    while (scanf("%d %d", &n, &k) != EOF) {
        for (i = 0, head = NULL; i < n; i ++) {
            scanf("%d", &data);
            createList(&head, data);
        }
        printLink(head);
        newhead = reverseK(head, k);
        printLink(newhead);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章