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; } |
美團筆試題:k鏈表翻轉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.