简单链表反转

taifeng123 2008-12-02 03:43:20
List::Reverse()
{
if(head==NULL)
return;
List *p1,*p2,*p3;
p1=head;
p2=p1->next;
while(p2->next!=NULL)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
p2->next=p1;
p1=p2;
head->next=NULL;
head=p1;
cout<<"逆置成功!"<<endl;
}
我这个比如输入:1 2 3 4 5 反转后是:4 3 2 1 0 最后一个不能反转,
...全文
151 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
taifeng123 2008-12-02
  • 打赏
  • 举报
回复
代码运行没有任何问题,就是最后一个结点转不到最前面,不知道为什么,感觉我的代码没有问题呀。
xinustc 2008-12-02
  • 打赏
  • 举报
回复
好像真的没问题
sixbusy 2008-12-02
  • 打赏
  • 举报
回复
我觉得你的代码 是没有问题的。是不是不输出的时候有问题。你单步调试看看,你的head 引导的内容确实已经翻转了!
awenason 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 taifeng123 的帖子:]
List::Reverse()
{
if(head==NULL)
return;
List *p1,*p2,*p3;
p1=head;
p2=p1->next;
while(p2->next!=NULL)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
p2->next=p1;
p1=p2;
head->next=NULL;
head=p1;
cout < <"逆置成功!" < <endl;
}
我这个比如输入:1 2 3 4 5 反转后是:4 3 2 1 0 最后一个不能反转,
[/Quote]
这指针,本来就不易理解。 最好把p1,p2,p3定义的有意义些,别人才容易理解你每一句的用途。
对试验的结果来看,就是边界没有处理好。导致遗漏数据。
debug跟下就知道差哪儿了。
taifeng123 2008-12-02
  • 打赏
  • 举报
回复
我的问题是我的代码怎么反转,
lbh2001 2008-12-02
  • 打赏
  • 举报
回复
给你个例子

#include <stdio.h>
#include <stdlib.h>
#define MAX 10
typedef struct List
{
int Number;
int Total;
struct List *Next;
}*Link;

int Data[2][MAX] =
{ 1, 3, 5, 7, 2, 4, 6, 8, 9, 10,
15,35,10,67,25,65,38,70,30,20,
};

Link Create_List(Link Head);
void Print_List(Link Head);
Link Invert_List(Link Head);
Link Reverse_List(Link Head);
void Free_List(Link Head);

int main(int argc, char *argv[])
{
Link Head = NULL;
Head = Create_List(Head);
if(NULL!=Head)
{
printf("Input Data : \n");
Print_List(Head);
Head = Invert_List(Head);
printf("After Invert1 : \n");
Print_List(Head);
Head = Reverse_List(Head);
printf("After Invert2 : \n");
Print_List(Head);
Free_List(Head);
}

return 0;
}

Link Create_List(Link Head)
{
Head = malloc(sizeof(*Head));
if(NULL==Head)
{
printf("Memory allocate Failure!\n");
}
else
{
Link Pointer;
int i;

Head->Number = Data[0][0];
Head->Total = Data[1][0];
Head->Next = NULL;

Pointer = Head;

for(i=1; i<MAX; ++i)
{
Link New = malloc(sizeof(*New));
if(New)
{
New->Number = Data[0][i];
New->Total= Data[1][i];
New->Next = NULL;

Pointer->Next = New;
Pointer = New;
}
else
{
printf("Memory allocate Failure!\n");
break;
}
}
}

return Head;
}

void Print_List(Link Head)
{
while(NULL!=Head)
{
printf("[%2d,%d] ", Head->Number, Head->Total);
Head = Head->Next;
}
putchar('\n');
}

Link Invert_List(Link Head)
{
Link Pointer;
Link Back;
Link Next;

if(Head==NULL || Head->Next==NULL) //节点为空或只有一个节点
{
return Head;
}
else if(Head->Next->Next==NULL) //只有二个节点

{
Back = Head;
Pointer = Back->Next;
Back->Next = NULL;
}
else
{
Back = Head;
Pointer = Back->Next;
Back->Next = NULL;

Next = Pointer->Next;
Pointer->Next = Back;
Back = Pointer;
Pointer = Next;

while(NULL!=Pointer->Next)
{
Next = Pointer->Next;
Pointer->Next = Back;
Back = Pointer;
Pointer = Next;
}
}
Pointer->Next = Back;
Head = Pointer;
return Head;
}

Link Reverse_List(Link Head) //更简洁的方法
{
if(NULL==Head || Head->Next==NULL)
return Head;
else
{
Link pointer = Head;
Head = Head->Next;
pointer->Next = NULL;

while(Head!=NULL)
{
Link tem = Head->Next;
Head->Next = pointer;
pointer = Head;
Head = tem;
}
return pointer;
}
}

void Free_List(Link Head)
{
Link Pointer;
while(NULL!=Head)
{
Pointer = Head;
Head = Head->Next;
free(Pointer);
}
}
enrico 2008-12-02
  • 打赏
  • 举报
回复
ding
taifeng123 2008-12-02
  • 打赏
  • 举报
回复
头指针怎么就到不了最后一个数呢 ?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧