「单链表逆置java」单链表逆置递归

博主:adminadmin 2023-01-14 07:45:07 973

本篇文章给大家谈谈单链表逆置java,以及单链表逆置递归对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

单链表逆置算法详解

首先创建一个单链表,返回一个头节点的指针( head 该头节点不为 NULL,

其次进行单链表的逆置设置。具体设置方法见下:

根据不同的长度依次进行逆置

单链表的逆置怎么办?

#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;

}

}

单链表就地逆置的两种方法(递归与普通循环)

一、用递归算法

对于不带头结点的单链表(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;    //返回新的子序列的头结点

}

二、用普通算法循环逆置(头插法重新建立带头结点的新链表)

参考链接:

关于单链表逆置java和单链表逆置递归的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。