社区
数据结构与算法
帖子详情
单向链表
HowWhatWhy
2004-08-08 04:37:12
如何不要用到额外的资源就把一个单向链表倒序排列
...全文
444
21
打赏
收藏
单向链表
如何不要用到额外的资源就把一个单向链表倒序排列
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jemmy
2005-08-31
打赏
举报
回复
list *pHead;
list *p;
p=NULL;
while(pHead)
{
list *q=pHead->next;
pHead->next=p;
p=pHead;
pHead=q;
}
pHead=p;
xiongbing528
2005-08-03
打赏
举报
回复
if(L==null) return;
p=L->next;
if(p==null) return;
q=L->next;
if(q==null) return p;
while(q->next)]
{
r=q;
q->next=p;
p=r;
q=q->next;}
q->next=p;
P->next==null;
L=P;
juipter
2005-07-21
打赏
举报
回复
首先把头接点截下来,然后把它的指针域置空,然后分别把首元结点开始,到尾结点为止,分别倒置,就完成了
Smile_Tiger
2005-07-12
打赏
举报
回复
伪码而已,不必认真,倒是偷懒想直接使用贴出来的代码,脸红的
gordonstysty
2005-07-12
打赏
举报
回复
建议大家的程序先debug ok了再贴上来,error的code贴上来,脸红的
zhuoranmcsd
2004-11-01
打赏
举报
回复
这个问题很简单啊,我没有看前面给出的算法,下面给一个很简单的思路:
1、假设单链表有头结点,指针L指向头结点
2、设置两个指针P、Q分别指向L->next和L->next->next
3、将P->next设空
4、(开始循环)将Q所指结点插入到头结点后,Q向后移(直到Q->next==NULL结束循环)
5、OVER
只是完成一个插入的工作
需要说明的是,在程序中需要另外设置一个指针S,指向Q->next,以保证操作的实现
下面是算法:
void reserve(LinkList &L)
{
p=L->next;
q=p->next;
s=q->next;
p->next=NULL;
while(s)
{
q->next=L-next; L->next=q;
q=s;s=s->next;
}
}
edward88cn
2004-10-29
打赏
举报
回复
什么都不用就想倒序排列,除非你是魔术师。上面的的算法都不错,绝对没有用到额外的资源
Leaveye
2004-10-14
打赏
举报
回复
唉,本质还都是一样。绝对的不另要空间的操作价值没有那么大了。
这是一个稳定性比较好的算法:
ListNode * Reverse(ListNode * pHead) {
ListNode * pTmp, pNewHead = '\0';
if(!pHead) return pHead;
while(pHead) {
pTmp = pHead->next;
pHead->next = pNewHead;
pNewHead = pTmp;
}
return pNewHead;
}
寻开心
2004-08-19
打赏
举报
回复
很抱歉
前面给出的算法有问题,不能实现翻转功能
解决这个问题,要分两步,第一步是不约束变量的使用,看看如何解决这个问题
假定有三个变量 pLast, pCur 和pNext,
其中pCur, 表示当前处理的节点, pLast 表示上一个节点,初始就是NULL
while ( pCur ) {
pNext = pCur->next; // 保存下一个位置
pCur->next = pLast; // 翻转指针,指向上一个位置
pLast = pCur; // 重置上一个位置的变量
pCur = pNext; // 当前指针下移
}
这样就可以完成翻转操作了。
第二步,我们看看那些变量可以简化掉
这就要利用链表的头 和 尾两个指针了
原来的头指针的next指针处理完成后,变成了NULL
而原来的尾指针的Next,在处理的中间过程是无用的,可以拿来使用
因此这两个东西都可以用来做特殊处理使用,
而pCur指针是可以作为参数传递进来使用的,
Reverse(List* pCur, List* pHead, List * pTail)
{
pTail->next = pHead;
pCur = pHead->next;
while ( pCur != pHead ) { // 因为初始化尾指针的next指针为pHead了,这就是结束条件
pHead->next = pCur->next;
pCur->next = pTail->next;
pTail->next = pCur;
pCur = pHead->next;
}
pHead->next = NULL;
}
在调用前的准备工作
CList * pList;
CList * pTail;
Reverse(pList, pList, pTail);
为了找到尾指针,还需要补充一个函数
List * FindTail(List *pList)
{
while ( pList->next != NULL ) {
pList = pList->next;
}
return pList;
}
补充,尾指针是必须要的
否则,当链表翻转操作完成后,就找不头了(因为头已经变成了尾部)
还使用原来的头指针就无法再遍历链表了
这样整个完整的操作就是:
CList *pList, pTail;
..... //初始化 pList;
pTail = FindTail(pList);
Reverse(pList, pList, pTail);
此后再用链表就要用pTail而不是pList了
Leaveye
2004-08-17
打赏
举报
回复
恩。。补充一下:上面这个“类比”也许有点不太恰当。一时也想不出更好的类比了。。
Leaveye
2004-08-17
打赏
举报
回复
让用2个指针就可以,效率不高,方法感觉有点类似9连环的解法。
其实1个指针也行,但是效率更低,比9连环还复杂。
:(
寻开心
2004-08-17
打赏
举报
回复
非递归的版本:
Reverse(List * pList, List * pHead)
{
while( pHead->next )
{
pHead->next = pList->next;
pList->next = pList;
pList = pHead->next;
}
}
使用
CList * pList;
Reverse(pList, pList);
看似没有利用资源,实质还是利用了——函数的入口参数
真正的一个也不利用可能吗?
寻开心
2004-08-17
打赏
举报
回复
// 写一个递归形式的
class List
{
DataType data;
List * pNext; // next list element
}
// pCur 要处理的链表的位置, pHead就是这个链表的头
Inverse(List* pCur, List* pHead)
{
if ( pCur->next == NULL ) {pCur->next = pCur; pHead->next=NULL; return; }
pHead->next = pCur->next;
// 头指针的next指针在翻转后,设置为NULL,没有用,可以用来做临时变量。
// 保存下一个位置
pCur->next = pCur;
// 把当前指针反转向上一个位置
Inverse(pHead->next, pHead);
// 处理后一个
}
使用的时候
List * pList;
Inverse(pList, pList); // 就可以了。
基本原理就是利用头指针的next指针作为
HowWhatWhy
2004-08-17
打赏
举报
回复
谁能回答一下呢
ZhangYv
2004-08-09
打赏
举报
回复
问过无数次的问题了,你可以GOOGLE之类搜现成的程序。
HowWhatWhy
2004-08-09
打赏
举报
回复
这谁不会说呀
具体程序怎么写呢
楼上没必要把题目重复一遍
jazy
2004-08-09
打赏
举报
回复
现有m1~m5
m1.next = m2,m2.next = m3,m3.next = m4,m4.next = m5,m5.next = NULL
变成m5~m1只要写:
m5.next = m4;
m4.next = m3;
m3.next = m2;
m2.next = m1;
m1.next = NULL;
HowWhatWhy
2004-08-09
打赏
举报
回复
我找不到啊
要求没有额外资源的
楼上帮帮忙吧
zhengwei1984222
2004-08-09
打赏
举报
回复
无法实现
HowWhatWhy
2004-08-08
打赏
举报
回复
说得容易 怎么改啊
加载更多回复(1)
单向链表
的C语言实现与基本操作
本文的主要内容目录: 一、
单向链表
的C语言实现 二、
单向链表
的基本操作 一、
单向链表
的C语言实现 链表作为一种基本的数据结构在程序开发过程当中经常会使用到。对C语言来说链表的实现主要依靠结构体和指针,所以本文相关内容和程序需要有C语言当中指针和结构体的基础。 链表是一种线性存储数据的结构,存储内容在逻辑上连续的,在物理上却不一定连续。
单向链表
的组成包括一个链表头(head)和若干
java
单向链表
双向链表_
单向链表
和双向链表的区别的意义 - Java篇
链表是常用的数据结构,在Java中有很多基于链表的容器实现类,例如HashMap、LinkedList。但是这些链表有的是
单向链表
,有的是双向链表,那么他俩有什么不同呢?(以下源码均属于jdk1.8.0_101)
单向链表
只有后一节点指针,在节点删除,移动的时候,需要暂存前一节点,删除的时候将前一节点和后一节点连接,因为比双向链表少维护一个前节点,只在删除的时候暂存,所以比
单向链表
节省资源,但是增加...
单向链表
的插入、删除(c++实现)
目录前言
单向链表
插入节点实现代码
单向链表
删除节点实现代码整个项目的完整代码运行截图总结 前言 本篇文章主要接着上文的c++实现
单向链表
进一步实现
单向链表
的插入、删除。
单向链表
插入节点 在
单向链表
中插入新节点犹如给一列火车加入新的车厢,而根据新节点插入位置的不同,分为三种不同的插入处理方式具体分析如下: 1.当在链表头部插入节点,只需把新节点的指针指向链表原来的第一个节点,再把链表头指针指向新节点...
单向链表
的C语言实现
首先,我们需要定义
单向链表
的结点和链表本身的结构//
单向链表
的结点定义// 数据域// 指针域,指向后继结点} Listnode;//
单向链表
的定义// 头结点// 整个链表的元素个数和:包含标准输入输出和标准库函数。:定义链表中数据的类型为int,可以根据需要更改。:定义链表结点结构体,包含数据域data和指向后继结点的指针next。:定义链表结构体,包含指向头结点的指针head和链表的元素个数size。
java实现
单向链表
目录
单向链表
示意图:
单向链表
实现代码:测试:结果:
单向链表
示意图: 以下是单链表相对于双链表的优缺点。 优点 (1) 只有一个指向下一个节点的指针。 (2)
单向链表
增加删除节点简单。遍历时候不会死循环。 缺点 (1) 只能从头到尾遍历。只能找到后继,无法找到前驱,也就是只能前进。
单向链表
实现代码: import java.util.Arrays; import java.util.Iterator; import java.util.NoSuchElementException; import j
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章