143.重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:
输入:head = [1,2,3,4]
输出:[1,4,2,3]
示例 2:
输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]
提示:
链表的长度范围为 [1, 5 * 104]
1 <= node.val <= 1000来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
放进数组里进行重排或者使用双指针找到中间节点,重排右端点,之后组合。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* find_midlle_node(struct ListNode* head){
struct ListNode* mid=head,*end=head;
while(end->next&&end->next->next){
end=end->next->next;
mid=mid->next;
}
return mid;
}
struct ListNode* inverse_list(struct ListNode* head){
struct ListNode* cur=head,*pre=NULL;
while(cur){
struct ListNode* tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
void merge_list(struct ListNode* list1,struct ListNode* list2){
while(list1!=NULL&&list2!=NULL){
struct ListNode* tmp1=list1->next,*tmp2=list2->next;
list2->next=list1->next;
list1->next=list2;
list1=tmp1;
list2=tmp2;
}
}
void reorderList(struct ListNode* head){
if(!head) return;
struct ListNode* mid=find_midlle_node(head);
struct ListNode* inverse=mid->next;
mid->next=NULL;
inverse=inverse_list(inverse);
merge_list(head,inverse);
}
25.K个一组反转链表
给你一个链表,每 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]
示例 3:输入:head = [1,2,3,4,5], k = 1
输出:[1,2,3,4,5]
示例 4:输入:head = [1], k = 1
输出:[1]
提示:列表中节点的数量在范围 sz 内
1 <= sz <= 5000
0 <= Node.val <= 1000
1 <= k <= sz来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
崩溃的点在于把部分的链表反转之后,头丢了。所以需要新建一个头,并且用一个前置指针不断移到下一组的前置节点表示前置的头。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseListNode(struct ListNode* head){
struct ListNode* pre=NULL,* cur=head;
while(cur){
struct ListNode* tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
struct ListNode* reverseKGroup(struct ListNode* head, int k){
struct ListNode* newHead=malloc(sizeof(struct ListNode));
newHead->next=head;
struct ListNode* pre=newHead;
int group;
while(true){
struct ListNode* tail=head;
group=k;
while(tail&&group!=1){
tail=tail->next;
group--;
}
if(!tail) return newHead->next;
struct ListNode* nex=tail->next;
tail->next=NULL;
//反转链表
tail=head;
head=reverseListNode(head);
pre->next=head;
tail->next=nex;
pre=tail;
head=nex;
}
return newHead->next;
}