From d93e8b1d359bea0252ebf993c496acb2e5ce25d4 Mon Sep 17 00:00:00 2001 From: begeekmyfriend Date: Tue, 18 Jul 2017 09:34:34 +0800 Subject: [PATCH] Reverse nodes in K group Signed-off-by: begeekmyfriend --- 025_reverse_nodes_in_k_group/Makefile | 2 + 025_reverse_nodes_in_k_group/reverse_nodes.c | 77 ++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 025_reverse_nodes_in_k_group/Makefile create mode 100644 025_reverse_nodes_in_k_group/reverse_nodes.c diff --git a/025_reverse_nodes_in_k_group/Makefile b/025_reverse_nodes_in_k_group/Makefile new file mode 100644 index 0000000..d0564d0 --- /dev/null +++ b/025_reverse_nodes_in_k_group/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test reverse_nodes.c diff --git a/025_reverse_nodes_in_k_group/reverse_nodes.c b/025_reverse_nodes_in_k_group/reverse_nodes.c new file mode 100644 index 0000000..680889b --- /dev/null +++ b/025_reverse_nodes_in_k_group/reverse_nodes.c @@ -0,0 +1,77 @@ +#include +#include + +struct ListNode { + int val; + struct ListNode *next; +}; + +static struct ListNode* reverseKGroup(struct ListNode* head, int k) { + if (head == NULL || k <= 1) { + return head; + } + + int first = 1; + struct ListNode dummy; + dummy.next = head; + struct ListNode *dhead = &dummy; + struct ListNode *prev = head; + struct ListNode *p = head->next; + struct ListNode *next = p == NULL ? NULL : p->next; + while (p != NULL) { + int i; + struct ListNode *end = dhead->next; + for (i = 0; end != NULL && i < k; i++) { + end = end->next; + } + if (i < k) { + break; + } + + while (p != end) { + p->next = dhead->next; + dhead->next = p; + prev->next = next; + p = next; + next = p == NULL ? NULL : p->next; + } + + if (first) { + first = 0; + dummy.next = dhead->next; + } + + dhead = prev; + prev = p; + p = p == NULL ? NULL : p->next; + next = p == NULL ? NULL : p->next; + } + return dummy.next; +} + +int main(int argc, char **argv) +{ + int i; + struct ListNode *p, *prev, dummy, *list; + + dummy.next = NULL; + prev = &dummy; + for (i = 2; i < argc; i++) { + p = malloc(sizeof(*p)); + int n = atoi(argv[i]); + printf("%d ", n); + p->val = n; + p->next = NULL; + prev->next = p; + prev = p; + } + putchar('\n'); + + list = reverseKGroup(dummy.next, atoi(argv[1])); + for (p = list; p != NULL; p = p->next) { + printf("%d ", p->val); + } + putchar('\n'); + + return 0; +}