逆置有两种方法,第一是把所有节点反过来。还有一种就是改变节点中的值。
我们提供的服务有:网站设计制作、成都网站制作、微信公众号开发、网站优化、网站认证、范县ssl等。为上千多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的范县网站制作公司
第一种情况,其实可以考虑用头插法,来实现逆置。
下面的算法是基于头插法的思想,逆置链表的,仅供参考。
LinkList anti_linklist(LinkList demo)
{
LInkList *p,*q;//work pointer
LinkList head;
head=new LinkList();
head-next=null;//init head pointer
p=demo-head-next;//make p points to the first node
if(p==null)
return null;//the linklist is null
while(p!=null)
{
q=p;
q-next=head-next;
head-next=q;
p=p-next;
}
}
1.
顺序表:
要将该表逆置,可以将表中的开始结点与终端结点互换,第二个结点与倒数第二个结点互换,如此反复,就可将整个表逆置了。算法如下:
//
表结构定义同上
void
ReverseList(
Seqlist
*L)
{
Datatype
t
;
//设置临时空间用于存放data
int
i;
for
(
i=0
;
i
L-length/2
;
i++)
{
t
=
L-data[i];//交换数据
L
-
data[
i
]
=
L
-
data[
L
-
length
-
1
-
i
]
;
L
-
data[
L
-
length
-
1
-
i
]
=
t
;
}
}
2.
链表:
也是可以用交换数据的方式来达到逆置的目的,但是由于是单链表,数据的存取不是随机的,因此算法效率太低,我们可以利用指针的指向转换来达到表逆置的目的。算法是这样的:
//
结构定义略
LinkList
ReverseList(
LinkList
head
)
{
//
将head
所指的单链表逆置
ListNode
*p
,*q
;//设置两个临时指针变量
if(
head-next
head-next-next)
{
//当链表不是空表或单结点时
p=head-next;
q=p-next;
p
-
next=NULL;//将开始结点变成终端结点
while
(q)
{//每次循环将后一个结点变成开始结点
p=q;
q=q-next
;
p-next
=
head-
next
;
head-next
=
p;
}
return
head;
}
return
head;//如是空表或单结点表,直接返回head
}
楼上的代码胡弄洋鬼子呢,也没实现逆置,只是逆向输出了一下!
java中没有指针,怎么实现用户自定义链表结构?java内置的list类型是jvm里用C语言实现的。所以你最好换成C/C++完成你的作业。
就是头插法,图片真心懒得画……
每一步实现的是这样的过程:
0(初始化)、q为每一步运算的主要节点位置,初始化为第一个;
1、r=q的后续,把q的后续记录下来;
2、q-》next=p,把q的后续指向p(也就是开始),换句话说,把q放在了最开始;
3、p=q,把新的开始设置为新插入的q(下一次循环时,他就是p了);
4、q=r,把下一步要进行运算的主要节点设置为r,也就是当前运算节点的下个节点。
相当于,一队小朋友双手搭着前一个人的肩。从第二个开始,把他挪到第一个人前面去,然后对下一个人做同样操作。
自己画画图吧,指针就是这么个东西。
用数据结构中的单链表求逆置的编程:
#include"iostream"
using
namespace
std;
struct
node{
int
data;
node
*next;
};
node
*p=NULL;
void
ins(int
x)
//将输入的数采用头插法放入链表中
{
node
*q=new
node;
q-data=x;
q-next=p;
p=q;
}
void
rev(int
i)
//将链表逆置并输出
{
node
*m;
//因为用了头插法放入数据所以输出的应与输入的相同
int
x;
m=p;
p=NULL;
int
j;
while(m!=NULL)
{
node
*n=m-next;
m-next=p;
p=m;
m=n;
}
cout"逆置链表后的结果:";
for(j=0;ji;j++)
{
x=p-data;
coutx;
p=p-next;
}
}
void
main()
{
int
i;
int
a[4];
cout"please
inpute
data(4个数):\n";
for(i=0;i4;i++)
cina[i];
for(i=0;i4;i++)
ins(a[i]);
rev(i);
}