【20190411】【每天一道算法题】旋转链表(链表)

问题:

给定一个链表,旋转链表,将链表每个节点向右移动 个位置,其中 是非负数。

例如:

输入: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. 链表节点未定义就使用(要先定义)!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Satisfying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值