您的位置:首页 > 其它

不带头节点的单向链表逆序

2014-10-11 16:16 288 查看
分析:

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 结点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: