– 题目:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
– 思路:移动链表长度length个位置时,等于没有移动,所以用 k % length 算出真正要移动的次数,然后将后面 k % length 个节点整体移动到到前面即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* rotateRight(struct ListNode* head, int k){
int last_part_length; //第一部分节点个数
int first_part_length; //第二部分节点个数
int length=0; //链表长度
//求链表长度
struct ListNode* temp=head;
while(temp!=NULL){
temp=temp->next;
length++;
}
if(k==0 || length== 0){
return head;
}
//求第一部分节点个数和第二部分节点个数
last_part_length = k % length;
first_part_length = length - last_part_length;
if(last_part_length==0){
return head;
}
struct ListNode* first_part_end=head;//第一部分的末节点
struct ListNode* last_part_start=NULL;//第二部分的首节点
struct ListNode* last_part_end=NULL;//第二部分的末节点
for(int i=0;i<first_part_length-1;i++){
first_part_end=first_part_end->next;
}
last_part_start=first_part_end->next;
if(first_part_end!=NULL){
first_part_end->next=NULL;
}
last_part_end=last_part_start;
for(int j=0;j<last_part_length-1;j++){
last_part_end=last_part_end->next;
}
last_part_end->next=head;
return last_part_start;
}
网站:https://leetcode-cn.com/problemset/all/
- 旋转链表 √
树题:
- 二叉树的中序遍历
图题:
- 克隆图