求不带头结点的单链表的逆置算法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求不带头结点的单链表的逆置算法?相关的知识,希望对你有一定的参考价值。
希望有算法 和C程序更好
要求 不带头节点
无论是空节点、一个节点、都行。
struct node
int data;
node * next;
;
void reverse(struct node ** head)
if( *head==0 ||(*head)->next==0)
return;
node * end = (*head)->next;
(*head)->next = 0;
while(end)
node *next = end->next;
end->next = *head;
*head = end;
end = next;
注意调用的时候要传头指针的地址,假如头指针 struct node * head;
这样调用reverse(&head); 参考技术B 3个指针a,b,c
下面是遍历过程
第一个结点:
a
第二个结点:
b a
第三个结点:
c b a
以后的结点3个指针同时往后移,直到a为null
每经过一个结点执行
b->next = c
c = b
b = a
a = a->next
节点少于3个单独判断一下,处理也很简单
开始节点注意->next要变成Null,最后返回a
1楼的回答数据规模稍微大一点就不行了,32位机的递归栈16,逆置超过16的链表就递归栈溢出了
线性表的链式表示
1. 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。
2.在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。
3. 设I为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。
4.试编写在带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯一的)。
5.试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为0(1)。
6.有一个带头结点的单链表L,设计一个算法使其元素递增有序。
7.设在一个带表头结点的单链表中所有元素结点的数据值无序,试编写一个函数,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素(若存在)。
8.给定两个单链表,编写算法找出两个链表的公共结点。
9.给定一个带表头结点的单链表,设head为头指针,结点结构为(data,next),data为整型元素,next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间(要求:不允许使用数组作为辅助空间)。
10. 将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。
11. 设C= {a1, b1, a2, b2, ..., an, bn}为线性表,采用带头结点的hc单链表存放,设计一个就地算法,将其拆分为两个线性表,使得A= {a1, a2, ..., an},B= {bn, ..., b2, b1}。
12. 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如(7, 10, 10, 21, 30, 42, 42, 42,51, 70)将变为(7, 10, 21, 30, 42, 51, 70)。
13.假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。
14.设A和B是两个单链表(带头结点),其中元素递增有序。设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A、B的结点。
15.已知两个链表A 和B分别表示两个集合,其元素递增排列。编制函数,求A与B的交集,并存放于A链表中。
16.两个整数序列A=a1, a2, a3, ..., am和B=b1, b2, b3, ..., bn已经存入两个单链表中,设计一个算法,判断序列B是否是序列A的连续子序列。
17.设计一个算法用于判断带头结点的循环双链表是否对称。
18. 有两个循环单链表,链表头指针分别为h1和h2,编写一个函数将链表h2链接到链表h1之后,要求链接后的链表仍保持循环链表形式。
19.设有一个带头结点的循环单链表,其结点值均为正整数。设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表空为止,再删除表头结点。
以上是关于求不带头结点的单链表的逆置算法?的主要内容,如果未能解决你的问题,请参考以下文章
单链表的逆置使用递归算法出现-842150451这个值,请求高手予以解决。。