分析:
可以用交换数据的方式来达到逆置的目的。但是由于是单链表,数据的存取不是随机的,因此算法效率太低。可以利用指针改指来达到表逆置的目的。具体情况入下:
(1)当链表为空表或只有一个结点时,该链表的逆置链表与原表相同。
(2)当链表含2个以上结点时,可将该链表处理成只含第一结点的带头结点链表和一个无头结点的包含该链表剩余结点的链表。然后,将该无头结点链表中的所有结点顺着链表指针,由前往后将每个结点依次从无头结点链表中摘下,作为第一个结点插入到带头结点链表中。这样就可以得到逆置的链表。算法是这样的:
结点结构定义如下:
typedef char DataType; //假设结点的数据域类型的字符
typedef struct node{ //结点类型定义
DataType data; //结点的数据域
struct node *next;//结点的指针域
}ListNode;
typedef ListNode *LinkList;
ListNode *p;
LinkList head;
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
}
---------------
另解:(比较费解)
void Inverse(LinkList L) // 费解;
{
LNode *p,*q,*s;
p=L->next;
if(p&&p->next)
{
q=p->next;
p->next=NULL;
}
while(q)
{
s=q->next;
q->next=p;
p=q;q=s;
}
L->next=p;
}
相关推荐
单链表 就地逆置的方法 逆置 txt
实现一个单链表的就地逆置,不使用新的空间,利用原来单链表空间
056 单链表就地逆置 C语言
单链表操作就地逆置删除mink到maxk之间的元素#include<stdio.h>
对以单链表为存储结构的表实现就地逆置,即在原有空间上实现逆置,不开辟新空间
数据结构中单链表就地逆置算法,不是程序设计代码
单链表的逆置方法(头插法、就地逆置法、递归实现)。
单链表的就地逆置单链表的就地逆置单链表的就地逆置单链表的就地逆置单链表的就地逆置
用c语言描述的线形表---链表---带头节点单链表的就地逆置
单链表算法实现增删改查,就地逆置、倒数第k个节点。不使用java任何工具方法,纯原生单链表,前插,修改,尾插,逆置等
单链表实现就地逆序,简单的程序代码。详细的请关注数据结构论坛
可以交换数据的方式实现,但单链表的数据的存取不是随机的,所以可以利用指针的指向转换来实现表的逆置。
数据结构与算法 c++实现 //删除顺序递增表中的重复元素 //对单链表实现就地逆置 //删除递增单链表中的重复元素 适合大二初学数据结构与算法 程序有详细备注 顺序表 单链表
有关单链表的创建,就地逆置,头插法,尾插法,输出等
感觉好就用,自己写的,应该是无毒的,保证可以运行
printf(" * G:就地逆置(La) H:删除x-y的元素(La) *\n"); printf(" * *\n"); printf(" * I:合并(删除相同项) J:合并(保留相同项) *\n"); printf(" * *\n"); printf(" * K:求两链表交集 L:退出程序 *\n"); ...
单链表就地逆置
用头插入法来做,直到输入0时,按enter键结束。
既然都讲到这里了,咱就先来讨论讨论单链表的两种建立方式————头插法和尾插法利用尾插法建立的单链表数据是顺序的,用头插法建立的单链表数据是逆序的例如:用数列 2
2、设计一算法,逆置带头结点的动态链表 L。要求利用原表的结点空间, 并要求用尽可能少的时间完成。 3、假设有两个按元素值递增有序的线性表 A 和 B,均以单链表作存储结构, 试编写算法将 A 表和 B 表归并成一个按...