[转]有(无)头结点的单向链表的反转(只需要三个指针)
/*定义数据结构类型,单向链表结构体包括数据部分和指针部分*/
struct node
{
unsigned int item;
struct node * next;
};
{
unsigned int item;
struct node * next;
};
/*不带头结点的反转函数,该函数采用三个结构体指针分别保存 前一节点 当前节点 后一节点 的值,将当前节点的指针域值直接指向前一节点,后一节点作为链表后面的引线,再将这三个指针往后移一位,递归进行前面的动作*/
struct node * reverse(struct node *head)
{
if((head == NULL) || (head->next==NULL)) //链表为空,或只有一个结点(无需反转),直接返回
return head;
struct node *pre, *cur, *ne;
pre = head; //将前面几个节点的地址依次保存在新定义的结构体指针
cur = head ->next;
while(cur)
{
ne = cur->next; //如果当前节点不为空,则将其指针域赋给ne指针
cur->next = pre; //直接将两个指针的指向反转
pre = cur; //将当前节点赋给pre,将三个指针在链表中的位子都往后移一位
cur = ne;
struct node * reverse(struct node *head)
{
if((head == NULL) || (head->next==NULL)) //链表为空,或只有一个结点(无需反转),直接返回
return head;
struct node *pre, *cur, *ne;
pre = head; //将前面几个节点的地址依次保存在新定义的结构体指针
cur = head ->next;
while(cur)
{
ne = cur->next; //如果当前节点不为空,则将其指针域赋给ne指针
cur->next = pre; //直接将两个指针的指向反转
pre = cur; //将当前节点赋给pre,将三个指针在链表中的位子都往后移一位
cur = ne;
}
head->next = NULL;//将原来的第一个节点的指针域赋为空,作为尾节点
head = pre; //将原来的尾节点变成新链表的第一个节点
head->next = NULL;//将原来的第一个节点的指针域赋为空,作为尾节点
head = pre; //将原来的尾节点变成新链表的第一个节点
return head;
}
}
******************************************************************
/*带头结点的反转函数,该函数采用三个结构体指针分别保存 前一节点 当前节点 后一节点 的值,将当前节点的指针域值直接指向前一节点,后一节点作为链表后面的引线,再将这三个指针往后移一位,递归进行前面的动作;因为此链表为带头结点的链表,头结点的数据域并没有存放有效的数据,此函数与上一函数的区别是,需要保持头结点不动,只需要反转后面存有效数据的结点部分*/
struct node * reverse(struct node *head)
{
if(!head || !head->next ) //判断链表是否为空或是否只有一个头节点
return head;
struct node *pre, *cur, *ne;
pre = head->next; //将前面几个节点的地址依次保存在新定义的结构体指针
cur = pre ->next;
while(cur)
{
ne = cur->next; //如果当前节点不为空,则将其指针域赋给ne指针
cur->next = pre; //直接将两个指针的指向反转
pre = cur; //将当前节点赋给pre,将三个指针在链表中的位子都往后移一位
cur = ne;
struct node * reverse(struct node *head)
{
if(!head || !head->next ) //判断链表是否为空或是否只有一个头节点
return head;
struct node *pre, *cur, *ne;
pre = head->next; //将前面几个节点的地址依次保存在新定义的结构体指针
cur = pre ->next;
while(cur)
{
ne = cur->next; //如果当前节点不为空,则将其指针域赋给ne指针
cur->next = pre; //直接将两个指针的指向反转
pre = cur; //将当前节点赋给pre,将三个指针在链表中的位子都往后移一位
cur = ne;
}
head->next ->next= NULL;//将原来的第一个节点的指针域赋为空,作为尾节点
head->next = pre; //将原来的尾节点变成新链表的第一个节点(头结点所指向的节点)
head->next ->next= NULL;//将原来的第一个节点的指针域赋为空,作为尾节点
head->next = pre; //将原来的尾节点变成新链表的第一个节点(头结点所指向的节点)
return head;
}
}
生命不息,奋斗不止