不带头节点的单向链表逆序
2014-10-11 16:16
288 查看
分析:
1、单向链表
2、不使用头节点
3、在不使用额外空间(不包括定义额外指针所占用的空间)的情况下,实现一个链表的逆序
*先定义链表的结构 typedef struct NODE {...},在此定义为单向链表。
*在 main() 函数中定义一个结点指针,此时并不为此指针开辟空间,而是将此指针的地址作为 CreateLink() 函数的参数,定义 CreateLink() 函数时用二级指针接收 pNode *pnode (手动输入的结点个数n也可以放在 CreateLink()函数 中输入)。
*Doit() 函数同样采用二级指针作为参数。
定义pNode 类型的指针 p、 r、 q ,p 和 r都指向链表的第一个结点(*pnode),q指向链表的的第三个结点(p->next->next),
通过 whilel() 循环,依次将 p指针 后一个(第一次操作指的是第二个)结点的 next指针 指向最前面的一个元素,即 r指针 指向的元素,此时这个元素变为新的最前面的元素,再将 r指针 指向它,及 r = p->next ; 再将 p 节点的指针指向 q 结点。q 指向 q -> next ;如图:
![](http://img.blog.csdn.net/20141011161858099?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU2lsZW5jZUNhcnJvdA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
*最后将指针 pnode 指向最前面的结点,即 r 结点。
1、单向链表
2、不使用头节点
3、在不使用额外空间(不包括定义额外指针所占用的空间)的情况下,实现一个链表的逆序
//C实现 #include <stdio.h> #include <windows.h> #include <malloc.h> typedef struct NODE { char ch; struct NODE *next; }Node, *pNode; void CreateLink(pNode *pnode, int _n) { int n = _n; int i = 0; pNode p = NULL, q = NULL; *pnode = (pNode)malloc(sizeof(Node)*1); (*pnode)->ch = 'A' + i++; (*pnode)->next = NULL; p = *pnode; while (--n) { q = (pNode)malloc(sizeof(Node) * 1); q->ch = 'A' + i++; q->next = NULL; p->next = q; p = q; } } void ShowLink(pNode _pnode) { pNode pnode = _pnode; while (pnode->next != NULL) { printf("%2c", pnode->ch); pnode = pnode->next; } printf("%2c\n", pnode->ch); } void Doit(pNode *pnode) { pNode p = *pnode; pNode r = p, q = p->next->next; while (p->next->next != NULL) { p->next->next = r; r = p->next; p->next = q; q = q->next; } p->next->next = r; r = p->next; p->next = NULL; *pnode = r; } void main() { pNode pnode = NULL; int n = 0; puts("Please enter number of node"); scanf_s("%d",&n); CreateLink(&pnode, n); ShowLink(pnode); Doit(&pnode); ShowLink(pnode); }
*先定义链表的结构 typedef struct NODE {...},在此定义为单向链表。
*在 main() 函数中定义一个结点指针,此时并不为此指针开辟空间,而是将此指针的地址作为 CreateLink() 函数的参数,定义 CreateLink() 函数时用二级指针接收 pNode *pnode (手动输入的结点个数n也可以放在 CreateLink()函数 中输入)。
*Doit() 函数同样采用二级指针作为参数。
定义pNode 类型的指针 p、 r、 q ,p 和 r都指向链表的第一个结点(*pnode),q指向链表的的第三个结点(p->next->next),
通过 whilel() 循环,依次将 p指针 后一个(第一次操作指的是第二个)结点的 next指针 指向最前面的一个元素,即 r指针 指向的元素,此时这个元素变为新的最前面的元素,再将 r指针 指向它,及 r = p->next ; 再将 p 节点的指针指向 q 结点。q 指向 q -> next ;如图:
*最后将指针 pnode 指向最前面的结点,即 r 结点。
相关文章推荐
- 逆序带头结点的单向链表
- 单向链表的逆序,不使用额外节点存储实现
- 不带头节点链表逆序的两种方法
- 单向链表(四) 修改指定节点的数据值、逆序输出
- 建立一个带头结点的的单向链表并输出到out53.dat和屏幕上。各节点的值为对应的下表。链表的节点数及输出地文件名作为参数传入
- 笔试题三:带头节点head链表逆序
- C 带头节点单链表逆序
- 单向链表的逆序操作
- 已知单向链表的头结点head,写一个函数把这个链表逆序 ( Intel)
- 在带头节点的单链表中,删除所有值为x的节点(Java实现)
- 华为OJ从单向链表中删除指定值的节点
- C语言版带头指针的单向链表
- 带头节点的链表的一些操作
- 带头结点的单链表的插入,删除,转置,清空,判断空,统计节点数目
- 单链表——带头节点
- [编程题]从单向链表中删除指定值的节点
- 2016年12月21日学习总结----单向循环链表操作程序(头插,尾插,中间插入,删除,逆序)
- 带头节点链表和不带头节点链表的初始化
- 带头节点的单链表
- 13. 求单向链表中倒数第k个节点