OR152. 每K个一组反转链表
描述
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。
输入描述
第一行输入是链表的值输出描述
当 k = 2 时,应当输出:示例1
输入:
1 2 3 4 5 2
输出:
2 1 4 3 5
C 解法, 执行用时: 2ms, 内存消耗: 248KB, 提交时间: 2019-10-20
#include <stdio.h> #include <stdlib.h> typedef struct Node{ int num; struct Node *next; }Node; int main(){ Node *head, *tail; head = tail = NULL; int n; int k; while(1){ scanf("%d", &n); Node *node = malloc(sizeof(Node)); node->num = n; node->next = NULL; if(head == NULL){ head = tail = node; } else{ tail->next = node; tail = node; } if(getchar() == '\n'){ break; } } scanf("%d", &k); Node *pLeft, *pRight; pLeft = pRight = NULL; Node *p1, *p2; p1 = p2 = head; while(1){// int i = 0; while(p2 != NULL && i < k-1){ p2 = p2->next; i++; } if(p2 == NULL){ //如果剩余部分长度小于k,则不翻转 break; } pRight = p2->next; //创建一个临时链表,对p1至p2部分进行翻转 Node *headtmp, *tailtmp; headtmp = tailtmp = NULL; Node *tmp_del; //用于删除节点保存元素下一指针的临时变量 while(p1 != p2->next){ Node *tmpnode = malloc(sizeof(Node)); tmpnode->num = p1->num; if(headtmp == NULL){ headtmp = tmpnode; tailtmp = tmpnode; } else{ tmpnode->next = headtmp; headtmp = tmpnode; } tmp_del = p1->next; free(p1); p1 = tmp_del; } //链接翻转部分 if(pLeft != NULL){ pLeft->next = headtmp; } else{ head = headtmp; } tailtmp->next = pRight; pLeft = tailtmp; p1 = p2 = pRight; } Node *tmp = head; while(tmp != NULL){ printf("%d ", tmp->num); tmp = tmp->next; } }
C 解法, 执行用时: 2ms, 内存消耗: 296KB, 提交时间: 2019-12-23
#include <stdio.h> #include <stdlib.h> typedef struct node { int val; struct node* next; } Node; Node* revertList(Node* head, int k) { //Node* next = head->next; Node* cur; Node* pre; Node* pos; //Node* pre = head; if (k == 1) { return head; } else if (k == 2) { head->next->next = head; return head->next; } //pre = head; //cur = head//head->next; //next = cur->next; cur = head->next; pre = head; for (int i = 0; i < k-1; i++) { pos = cur->next; cur->next = pre; pre = cur; cur = pos; } return pre; } int main() { int n, k; Node* head; Node* tempTail; Node* tempHead; Node* revertHead; Node* tail; //Node* head; head = NULL; revertHead = NULL; Node* temp; int count, i; // create link list while (1) { scanf("%d", &n); temp = (Node*)malloc(sizeof(Node)); if (temp == NULL) { return -1; } temp->val = n; temp->next = NULL; if (head == NULL) { head = temp; tail = temp; } else { tail->next = temp; tail = tail->next; } if (getchar() == '\n') { break; } } scanf("%d", &k); // revert list local k //segHead = head; tempHead = head; //tempHead = head; tempTail = (Node*)malloc(sizeof(Node)); revertHead = tempTail; temp = head; while (temp != NULL) { i = 0; while ((temp != NULL) && (i < k - 1)) { temp = temp->next; i++; } if (temp == NULL) { tempTail->next = tempHead; break; } else { temp = temp->next; tempTail->next = revertList(tempHead, k); tempHead->next = NULL; tempTail = tempHead; tempHead = temp; } } for (temp = revertHead->next; temp != NULL; temp = temp->next) { printf("%d ", temp->val); } free(revertHead); revertHead = NULL; }