题目:
给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5]
示例 2:
输入:head = [1,2,3,4,5], k = 3 输出:[3,2,1,4,5]
提示:
- 链表中的节点数目为
n
1 <= k <= n <= 5000
0 <= Node.val <= 1000
代码:
头结点不存储有效数值:
#include<stdio.h>
#include<stdlib.h>typedef struct ListNode {int val;struct ListNode *next;
}Node;void Create(struct ListNode** head);
struct ListNode* reverseKGroup(struct ListNode* head, int k);int main()
{Node*head;Create(&head);Node*res=reverseKGroup(head,2);res=res->next;while(res!=NULL){printf("%d ",res->val);res=res->next;}return 0;
}void Create(struct ListNode** head)
{*head=(Node*)malloc(sizeof(Node));int n;(*head)->next=NULL;scanf("%d",&n);Node*end,*ins;end=*head;for(int i=0;i<n;i++){ins=(Node*)malloc(sizeof(Node));int a;scanf("%d",&a);ins->val=a;ins->next=NULL;end->next=ins;end=ins;}
}struct ListNode* reverseKGroup(struct ListNode* head, int k)
{struct ListNode*temp=head->next;int len=0;for(;temp!=NULL;temp=temp->next){len++;}struct ListNode*nextend=head->next;struct ListNode*end=head;struct ListNode*ins=end->next;end->next=NULL;int p=0;while(p<=len){if(p+k>len)break;struct ListNode*temp2;for(int i=0;i<k;i++){temp2=ins->next;ins->next=end->next;end->next=ins;ins=temp2;}p=p+k;end=nextend;nextend=temp2;}end->next=nextend;return head;
}
头结点存储有效数值(LeetCode)
struct ListNode* reverseKGroup(struct ListNode* head, int k)
{struct ListNode*temp=head;int len=0;struct ListNode*res=(struct ListNode*)malloc(sizeof(struct ListNode));for(;temp!=NULL;temp=temp->next){len++;}struct ListNode*nextend=head;struct ListNode*end=res;struct ListNode*ins=head;end->next=NULL;int p=0;while(p<=len){if(p+k>len)break;struct ListNode*temp2;for(int i=0;i<k;i++){temp2=ins->next;ins->next=end->next;end->next=ins;ins=temp2;}p=p+k;end=nextend;nextend=temp2;}end->next=nextend;return res->next;
}