首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

反转链表 用递归算法 讲解一下吧 小弟我实在是理解不了链表反转的有关问题了

2012-02-06 
反转链表用递归算法讲解一下吧我实在是理解不了链表反转的问题了最重要的是表明那个指针指向那里?指针的指

反转链表 用递归算法 讲解一下吧 我实在是理解不了链表反转的问题了
最重要的是表明   那个指针指向那里?指针的指向问题始终解决不了啊

拜托各位大虾了,反转链表的问题烦恼我很久了,解决不了啊

小女子,真的谢谢你们了

[解决办法]

// 链表结构

struct List { struct List* nextl int key; };

// 递归实现反转链表

List *reverse(List *oldList, List *newHead=NULL)
{
// 记录剩余的链表

List *next = oldList-> next;

// 将当前的节点插入到newHead链表的开头

oldList-> next = newHead;
newHead = oldList;

// 递归处理剩余的链表

return (next==NULL)? newHead: reverse(t, newHead);
}

void main()
{
List *list;

// 调用的时候newHead使用默认的NULL

List *q = reverse(list);
}


[解决办法]
你有3个问题都没有弄清楚之前不适合做这个题目:
1. 指针的概念,到底什么时候是使用的指针本身,什么时候是引用的所指向的值。
2. 递归的实现,你需要找一个简单的递归函数先研究研究,刚开始研究递归的时候确实有点难度,不过弄明白就好了。建议弄递归之前先复习一下计算机如何执行代码的,也就是栈在程序执行时候起到的作用。
3. 链表本身的数据结构,先不要去管什么双向链表,什么树啊图的,找一个简单的单项链表,看看是如何进行插入删除操作的。自己写点代码测试测试,体会体会。

上面3个问题一个个解决,估计1个礼拜就够了,然后你就会恍然大悟,原来是这样。。。
[解决办法]
单链表的逆置的实现:



(1)算法

struct link
{
int data;
struct link *next;
};

link reverse(link x)
{
if( NULL==x )
return NULL;

link t=NULL;
link r=NULL, y=x; //(0)
while(y!=NULL)
{
t = y-> next; //(1)
y-> next = r; //(2)
r = y; //(3)
y = t; //(4)
}

return r; //返回逆置后的链表
}

(二)原理
(0)(1)(2)(3)(4)分别对应以上程序的各序号
第一次while循环
-------------------------------------------
(0) r=NULL, y=x

r=NULL a ---> b ---> c ---> d --> NULL
|(0)
y

-------------------------------------------
(1) t =y-> next

r=NULL a ---> b ---> c ---> d --> NULL
|(0) | (1)
y t


--------------------------------------------
(2) y-> next = r

a ---> NULL b ---> c ---> d --> NULL
|(0) (2) | | (1)
y r t

---------------------------------------------
(3) r = y

a ---> NULL b ---> c ---> d --> NULL
|(0) (2) | (1)
y t
|(3)
r

---------------------------------------------
(4) y = t

a ---> NULL b ---> c ---> d --> NULL
|(0) (2) | (1)
| t
|(3) | (4)
r y


第二次while循环(并对上面进行整理)
---------------------------------------------
(1) t = y-> next

a ---> NULL b ---> c ---> d --> NULL
| | |(1)
r y t

---------------------------------------------
(2) y-> next = r

b ---> a ---> NULL c ---> d --> NULL
| (2) | |(1)
y r t

---------------------------------------------


(3) r = y

b ---> a ---> NULL c ---> d --> NULL
| (2) |(1)
y t
| (3)
r

---------------------------------------------
(4) y = t

b ---> a ---> NULL c ---> d --> NULL
| (2) |(1)
| t
| (3) |(4)
r y


第三个循环 (并对上面的进行整理)
---------------------------------------------
(1) t = y-> next

b ---> a ---> NULL c ---> d --> NULL
| | |(1)
r y t

以后的与第二次循环同, 最终可得:

d ---> c ---> b ---> a ---> NULL



引用地址:http://blog.programfan.com/trackback.asp?id=11456
[解决办法]
head-> next-> next=p,的地方看不明白,不知道到底指的是哪里,
====================================
head-> next 是 head 的下一个节点
-> next 表示再下一个节点
也就是 head 后第二个节点,=p 表示赋值为p
就是把 p 作为 head 后第二个节点

p=head 与head=p
===========
p=head //p 指向 head指向的位置
head=p //head指向 p指向的位置

假设 p=&a, head=&b
p=head, 那么 p和head 都 指向b
head=p, 那么 p和head 都 指向a

热点排行