反转单链表。假设单链表的数据结构定义如下:
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkedList;
第一种方法就是重新建立一个单链表newList,每次将list中的第一个结点放到newList后面。注释比较详细,所以就不具体说了,直接看代码吧:
LinkedList ReverseSinglyLinkedList(LinkedList list)
{
LinkedList newList; //新链表的头结点
LNode *tmp; //指向list的第一个结点,也就是要摘除的结点
//
//参数为空或者内存分配失败则返回NULL
//
if (list == NULL || (newList = (LinkedList)malloc(sizeof(LNode))) == NULL)
{
return NULL;
}
//
//初始化newList
//
newList->data = list->data;
newList->next = NULL;
//
//依次将list的第一个结点放到newList的第一个结点位置
//
while (list->next != NULL)
{
tmp = newList->next; //保存newList中的后续结点
newList->next = list->next; //将list的第一个结点放到newList中
list->next = list->next->next; //从list中摘除这个结点
newList->next->next = tmp; //恢复newList中后续结点的指针
}
//
//原头结点应该释放掉,并返回新头结点的指针
//
free(list);
return newList;
}
第二种方法是每次都将原第一个结点之后的那个结点放在list后面,下图是原始的单链表。
LinkedList ReverseSinglyLinkedList(LinkedList list)
{
LNode *tmp = NULL;
LNode *p = NULL;
if (list == NULL)
{
return NULL;
}
tmp = list->next;
while (tmp->next != NULL)
{
p = tmp->next;
tmp->next = p->next;
p->next = list->next;
list->next = p;
}
return list;
}
详情见:http://www.cnblogs.com/pianoid/archive/2011/05/03/reverse-a-singly-linked-list.html