【20190412】【每天一道算法题】反转链表(链表)

版权声明:=================== 转载请注明出处======================= https://blog.csdn.net/weixin_40583722/article/details/89228879

问题:

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

进阶:

你可以迭代或递归地反转链表。你能否用两种方法解决这道题?


思路与解答:(有疑问未解答)

/* 思路:分成两部分(待处理和已处理),每次将待处理的最后一个元素放到已处理的最后面,递归我不会啊。。。该学习一下*/
#include<stdio.h>
#include<stdlib.h>

struct ListNode *CreateList(void);
int lengthList(struct ListNode *head);
struct ListNode *reverseList(struct ListNode *head);
struct ListNode  //结构体定义,最后要加分号!
{
	int val;
	struct ListNode *next;
};

int main(void)
{
	struct ListNode *List = NULL;
	struct ListNode *ResultList = NULL;
	List = CreateList();
	ResultList = reverseList(List);

	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;  //函数类型是结构体指针类型,那么返回值也是结构体指针类型!
}

//求链表长度,已验证正确性
int lengthList(struct ListNode *head) 
{
	int len = 0;
	struct ListNode *p = head->next; //注意:表示p指向head后面的元素,而不是指向head!p指向head用:p=head
	if(p == NULL)
		return 0;
	for(; p != NULL; )
	{
		len++;
		p = p->next;
	}
	return len;
}

struct ListNode *reverseList(struct ListNode *head)
{ 
	int k;  //计数:表开头应该跳过的长度(也就是开头的元素个数,也就是循环次数,并且循环次数为链表长度-1)
	int len;
	struct ListNode *pHead = NULL;  //始终指向【待处理】元素中的第一个元素
	struct ListNode *pHeadBefore = NULL; //始终指向【已处理】元素中的最后一个元素
	struct ListNode *pTail = NULL;  //始终指向最后一个元素
	struct ListNode *pTailBefore = NULL;  //始终指向倒数第二个元素
	len = lengthList(head);
	if(len == 0) 
		return 0;
	else if(len == 1)
		return head;
	else
	{
		pHead = head->next; //pHead不用循环变化,因为【待处理】元素的第一个元素,一直都是原链表的首元素(没有变化)
		pHeadBefore = head;
		for(k=0; k<len-1; k++)
		{
			pTail = head;
			pTailBefore = head;
			while(pTail->next != NULL) 
				pTail = pTail->next;
		    while(pTailBefore->next != pTail)
				pTailBefore = pTailBefore->next;
			//执行完之后,pTail指向最后一个元素,pTailBefore指向倒数第二个元素
			pHeadBefore->next = pTail;
			pTail->next = pHead;
			pTailBefore->next = NULL;
			pHeadBefore = pHeadBefore->next;
		}
	}
	return head;
}

我的疑问: 

为什么本地IDE编译结果正确,LeetCode结果不正确?

猜你喜欢

转载自blog.csdn.net/weixin_40583722/article/details/89228879