???这样单链表反转如何、

gl615 2008-05-22 10:56:54
如果嫌下面的话啰嗦就直接看看程序吧,反转有问题。。
----------------------------------------------------------------------------------------------------
我通过自己写的一个push()方法来创建单链表,链表只有一个头结点head,push()大致是这样的:如果按顺序push()-->0,1,2,3,4,5,6,7,8,9的话,那么创建出来的单链表就是头结点指向9的,链表即:9,8,7,6,5,4,3,2,1,0.是一个逆向的。
现在我又弄了个方法Reversal(),这时链表已经创建完成,想通过它来实现反转。大致描述:用一个临时变量temp来代表head,把它从链表头依次指向链表尾。当它指向头的时候,我就push()入temp的数值(这时是9),这时链表就是9,9,8,7..
然后我又弄个临时变量t来代替temp,把temp指向他自己的下一个,再就直接删除t,想达到删除链表原始的那个9的目的,这时链表就是:9,8,7,6... 现在temp指向的是8,然后有push()一个8进来,再把原始的8删除... 这样循环最终的目的就是链表为:0,1,2,3,4,5,6,7,8,9. head指向0.
这样我想就好像达到了把单链表反转的目的了,但就是删除的时候有错误,不知道如何是好。




请各位指点!!
==============================================================================================
#include <iostream.h>
template<typename T>
class MyList
{
public:
struct Node
{
T value;
Node* next;
};

MyList()
{
head=NULL;
}

void push(T e1) -----------//从链表头插入e1
{
Node* temp=new Node;
temp->value=e1;
temp->next=head;
head=temp;
}

void Reversal() -----------------//反转??
{
Node* temp=head;
for(;temp!=NULL;)
{
Node* t=temp;
push(temp->value);
temp=temp->next;
//delete t;
}
}

void Traversal() -----------------//遍历链表
{
Node* temp=head;
for(;temp!=NULL;temp=temp->next)
{
cout<<temp->value<<ends;
}
cout<<endl;
}

protected:
Node* head;
};

void main()
{
MyList<int> mylist1;
for(int i=0;i<10;i++)
{
mylist1.push(i);
}
mylist1.Reversal();
cout<<"mylist1:"<<endl;
mylist1.Traversal();
}

==================================================================================
...全文
688 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cinderellaxw 2011-09-13
  • 打赏
  • 举报
回复
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。此贴从此陨落。
vocanicy 2008-05-23
  • 打赏
  • 举报
回复
单向链表反转很简单的,只需挨个将next指针指向前一个节点

void Reversal()
{
if(head != NULL)
{
Node *p = NULL, *n = head->next;
for(; n != NULL;)
{
head->next = p;
p = head;
head = n;
n = n->next;
}
}
}
gl615 2008-05-23
  • 打赏
  • 举报
回复
难道我汉字写多了、、、 555555
gl615 2008-05-23
  • 打赏
  • 举报
回复
问了这长时间还没 问到点子上来 真的想 欲哭无泪啊..

为什么不能delete掉要删除的节点呢?? 老天啊。。
gl615 2008-05-23
  • 打赏
  • 举报
回复
上面的朋友基本上反转了,但丢失了原链表的末节点。(把最后一句的head=p改为:head=q就OK) 。

先说声谢谢,但我还是想弄明白我自己写的Reversal()方法中为什么不能delete掉要删除的节点呢??

再次求助啊、、
gl615 2008-05-23
  • 打赏
  • 举报
回复
上面的朋友基本上反转了,但丢失了原链表的末节点。

先说声谢谢,但我还是想弄明白我自己写的Reversal()方法中为什么不能delete掉要删除的节点呢??
zsxcn 2008-05-23
  • 打赏
  • 举报
回复
void Reversal()
{
Node *p=head,*q,*r;
q=p->next;
p->next=null;
if(q) r=q->next;
while(r){
q->next=p;
p=q;
q=r;
r=r->next;
}
q->next=p;
head=p;
}
gl615 2008-05-23
  • 打赏
  • 举报
回复
我的那个Reversal()里面的delete为什么不行啊,我很想从delete上面修改啊。
Zhentiwei 2008-05-23
  • 打赏
  • 举报
回复
用3个指针,你试试看
Zhentiwei 2008-05-23
  • 打赏
  • 举报
回复

header-> node ->node ->node ->node
p q r

while(r)
{
q->next = p;
p = q;
q = r;
r = r->next;
}
试试这个如何?
gl615 2008-05-23
  • 打赏
  • 举报
回复
谁来帮忙看下啊。 .....
我都急死了、、
gl615 2008-05-23
  • 打赏
  • 举报
回复
上面的不行啊、、、
gl615 2008-05-22
  • 打赏
  • 举报
回复
来个人帮忙看一下嘛,好郁闷啊。。

64,637

社区成员

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

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