今天给各位分享java单链表的逆置的知识,其中也会对数据结构单链表的逆置进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、单链表的逆置怎么办?2、用java来编写一个单链表类的成员函数,实现对头结点的单链表就地逆置的操作3、单链表逆置算法详解4、单链表就地逆置的两种方法(递归与普通循环)5、单链表逆置
单链表的逆置怎么办?
#include stdio.h
#include stdlib.h
typedef struct node
{
int data;
struct node *next;
}Node;
//创建链表
Node *CreatList(void)
p = (Node *)malloc(sizeof(Node));
p-data = i;
if(head == NULL)
q = head = p;
else
q-next = p;
q = p;
scanf(“%d”, i);
}
p-next = NULL;
return head;
}
//链表的逆置
Node *ReverseList(Node *head)
{
Node *p, *q, *r;
p = head;
q=r=NULL;
while(p)
//输出链表
void PrintList(Node *head)
{
Node *p;
p = head;
while(p)
{
printf(“%d\n”, p-data);
p = p-next;
}
}
int main(void)
{
Node *head;
head = CreatList();
printf(“链表逆置前的数据:\n”);
PrintList(head);
head = ReverseList(head);
printf(“链表逆置后的数据:\n”);
PrintList(head);
存储表示:
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))
链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。
用java来编写一个单链表类的成员函数,实现对头结点的单链表就地逆置的操作
逆置有两种方法,第一是把所有节点反过来。还有一种就是改变节点中的值。
第一种情况,其实可以考虑用头插法,来实现逆置。
下面的算法是基于头插法的思想,逆置链表的,仅供参考。
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;
}
}
单链表逆置算法详解
首先创建一个单链表,返回一个头节点的指针( head 该头节点不为 NULL,
其次进行单链表的逆置设置。具体设置方法见下:
根据不同的长度依次进行逆置
单链表就地逆置的两种方法(递归与普通循环)
一、用递归算法
对于不带头结点的单链表(a1,a2,a3,a4,a5,a6)逆置后的结果为(a6,a5,a4,a3,a2,a1)
考虑递归算法,若只有一个结点,则直接返回,若存在两个结点(a1,a2)则需要做的操作有:
a2-next=a1;a1-next=NULL;return a2;
a2即新的头结点,若有三个结点,则应先将子链(a2,a3)先逆置且返回该子链的新的头结点,然后把子链(a2,a3)当作一个复合结点a2’,组成新的二元组(a1,a2’)然后就可以执行前面相同的操作:a2′-next=a1;a1-next=NULL;return a3′; 即可,多个以上的结点可同理得到,
Node *Reverse(Node *head)
{
Node *p=head;
if(p==NULL)
return NULL; //若是空链表,返回空
Node *q=p-next;
if(q==NULL)
return p; //若只有一个结点,直接返回
else
head=Reverse(q);//记录子序列的新的头结点
q-next=p; //当前结点与已经逆置的子序列看成是前后的两个结点p,q,作相应的逆置操作
p-next=NULL;
return head; //返回新的子序列的头结点
}
二、用普通算法循环逆置(头插法重新建立带头结点的新链表)
参考链接:
单链表逆置
a:将单链表储存为数组,然后按照数组的索引逆序进行反转。
b:使用3个指针遍历单链表,逐个链接点进行反转。
c:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
d: 递归(相信我们都熟悉的一点是,对于树的大部分问题,基本可以考虑用递归来解决。但是我们不太熟悉的一点是,对于单链表的一些问题,也可以使用递归。可以认为单链表是一颗永远只有左(右)子树的树,因此可以考虑用递归来解决。或者说,因为单链表本身的结构也有自相似的特点,所以可以考虑用递归来解决)
pre指向前一个结点,cur指向当前结点,next指向下一个节点。
循环实现
递归实现
思路参考
关于java单链表的逆置和数据结构单链表的逆置的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。