问题:
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
例如:
输入:0->1->2->NULL, k = 4
输出:2->0->1->NULL
解释:
向右旋转 1 步:2->0->1->NULL
向右旋转 2 步:1->2->0->NULL
向右旋转 3 步:0->1->2->NULL
向右旋转 4 步:2->0->1->NULL
思路与解答:(结果不正确,要修改)
下面操作循环k次:
/* 思路:1. 特殊情况:链表为空,返回0;链表只有一个元素,返回原链表;
* 2. 元素个数有两个及以上时,三步操作(循环k次):
* 第一,尾节点指向第一个元素;
* 第二,头指针指向原尾节点;
* 第三,删掉倒数第二个元素指向尾节点的那条链。
*/
#include<stdio.h>
#include<stdlib.h>
struct ListNode *rotateRight(struct ListNode* head, int k);
struct ListNode *CreateList(void);
struct ListNode //这个结构体要先定义再使用!
{
int val;
struct ListNode *next;
}; //注意:结构体定义完,要加分号!
int main(void)
{
struct ListNode *List = NULL;
struct ListNode *ResultList = NULL;
int k =2;
List = CreateList();
ResultList = rotateRight(List, k);
printf("%d\n", ResultList->next->val);
system("pause");
return 0;
}
struct ListNode* CreateList(void) //CreateList是函数名,struct ListNode当作一个整体,是我们上面自己定义的函数类型。
{
int len;
int i;
int val;
struct ListNode* pHead = (struct ListNode*)malloc(sizeof(struct ListNode));
if(NULL==pHead)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
struct ListNode* pTail = pHead;
pTail->next = NULL;
printf("请输入需要生成的链接节点的个数:len=");
scanf("%d",&len);
for(i=0;i<len;++i)
{
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&val);
struct ListNode* pNew = (struct ListNode *)malloc(sizeof(struct ListNode));
if(NULL==pNew)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
pNew -> val = val;
pTail -> next = pNew;
pNew -> next = NULL;
pTail = pNew;
}
return pHead; //函数类型是结构体指针类型,那么返回值也是结构体指针类型!
}
struct ListNode* rotateRight(struct ListNode* head, int k)
{
if(head->next == NULL)
return 0;
else if(head->next->next == NULL)
return head;
struct ListNode *pTail = head->next; //定义一个指针让它始终指向(单)链表的表尾,初始化为指向第一个元素。
struct ListNode *pTailBefore = head->next;
pTail = pTail->next;
while(pTail->next != NULL) //执行完毕之后,pTail指向了最后一个元素,pTailBefore指向了倒数第二个元素
{
pTail = pTail->next;
pTailBefore = pTailBefore->next;
}
int i; //计循环次数,一共循环k次
for(i=0; i<k; i++)
{
pTail->next = head->next;
head->next = pTail;
pTailBefore->next = NULL;
pTailBefore = head->next;
pTail = pTailBefore->next;
while(pTail->next != NULL) //执行完毕之后,pTail指向了最后一个元素,pTailBefore指向了倒数第二个元素
{
pTail = pTail->next;
pTailBefore = pTailBefore->next;
}
}
return head;
}
犯的错误:
1. 定义结构体忘记加分号(要加分号)!
2. 链表节点未定义就使用(要先定义)!