读书人

链表逆序

发布时间: 2013-01-19 11:41:36 作者: rapoo

链表逆序 求助啊
设计一个算法,将一个带头结点的数据域为a1,..,an的单链表的所有结点转置。

void Reverse(LinkList *&head)
{
LinkList *p = head->next;
head->next = NULL; //这条语句到底有何用? dgh 创建头结点
while(p != NULL) /*扫描所有结点 */
{
q = p->next; //让p指向*p结点的下一个结点
p->next = head->next; //总是将*p结点作为第一个数据结点
head->next = p;
p = q; //让p指向下个结点
}
}

对这段代码不理解,特别是这两句
p->next = head->next; //总是将*p结点作为第一个数据结点
head->next = p;
不是把头结点 插入到两结点之间了吗
算法 c
[解决办法]
比如一个链表head-->a1-->a2-->a3
LinkList *p = head->next;//新建了一个指针p,让它指向head->next,即现在p指向a1
head->next = NULL;//是head断开与链表的连接,相当于重新构建链表,这一步也可以不做的。
现在又两个链表,一个是head,一个是a1-->a2-->a3,当前p指向a1。
进循环
q = p->next;//新建一个指针指向p->next,即a2,防止下次循环找不到链表
p->next = head->next;//此时p已经脱离原链表,需要将它加到head链表上,先让它链到head->next
head->next = p;//然后让head链到p。此时两个链表分别是head-->a1和 a2-->a3,q指向a2
p = q;//让p=q,即让p指向a2,重新链到链表,进入下一次循环。

q = p->next;//新建一个指针指向p->next,即a3,同上
p->next = head->next;//同上
head->next = p;//同上,此时两个链表分别是head-->a2-->a1和 a3,q指向a3
p = q;//让p=q,即让p指向a3,重新链到链表,进入下一次循环。

q = p->next;//新建一个指针指向p->next,即NULL,同上
p->next = head->next;//同上
head->next = p;//同上,此时head链表是head-->a3-->a2-->a1,q为NULL
p = q;//让p=q,即p=NULL

循环结束。


其实这种程序,楼主最好是单步调试,看看它是怎么走的。在纸上边走边画。很好懂的。

读书人网 >C语言

热点推荐