版权声明:=================== 转载请注明出处======================= 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结果不正确?