请帮我看个链表算法。谢先!

chenyi3315 2005-03-10 03:59:42
题目:
以单链表作存储结构实现线性标的就地逆置算法,即在原表的存储空间将线性表(a1,a2,...,an)逆置为(an,an-1,...,a1).
请帮我看看下面的算法是否有错,如果没错,请帮我解释一下while循环中的语句具体如何接成链表的。谢谢先!!!
用单链表作为存储结构
void invert(LinkList L)
{
Node *p, *q, *r;
if(L->next ==NULL) return; /*链表为空*/
p=L->next;
q=p->next;
p->next=NULL; /* 摘下第一个结点,生成初始逆置表 */
while(q!=NULL) /* 从第二个结点起依次头插入当前逆置表 */
{r=q->next;
q->next=L->next;
L->next=q;
q=r;
}
}
...全文
171 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujingfu123 2005-03-10
  • 打赏
  • 举报
回复
链表的操作,你画一个示意图就很明白了……

这是个好习惯,呵呵
chenyi3315 2005-03-10
  • 打赏
  • 举报
回复
谢谢了。看懂了
TangChin 2005-03-10
  • 打赏
  • 举报
回复
我觉得没问题
从代码中看这是一个带头节点的单链表,要注意倒置后链表头指针要指向倒置前的最后一个节点,我想也在while中使用L的原因。

在while循环中,q作为迭代指针遍历链表,当q==NULL时最后一个节点也处理完毕了。
r = q->next;//备份q->next;
q->next=L->next;//将q的next指向前一个节点
L->next=q;//更新L->next;
q=r;//q向后移动

其实画个图更直观更容易理解。
Flood1984 2005-03-10
  • 打赏
  • 举报
回复
示意图如下:
链表 :
1 2 3 ...n-1 , n , n+1....
| | |
L->next q r
Flood1984 2005-03-10
  • 打赏
  • 举报
回复
while(q!=NULL) /* 从第二个结点起依次头插入当前逆置表 */
{r=q->next; //保存当前操作接点的next
q->next=L->next;//将q的next指向前一个接点
L->next=q;//将q的地址保存在 L->next 中
q=r;//后移一位
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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