#include <stdio.h>
typedef int ElemType;
typedef struct LNODE
{
ElemType data;
struct LNODE *next;
}LNODE, *LinkList;
//寻找单链表的中间结点: 慢指针走一步,快指针走两步
LNODE *middle(LNODE *head)
{
if(NULL == head)
{
return NULL;
}
LNODE *fast, *slow; //快指针、慢指针、临时指针
fast = slow = head;
while ((NULL != fast->next) && (NULL != fast->next->next))
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
//将一个单链表反序:从头部开始
LinkList reverse(LinkList list)
{
if ((list == NULL) || (list->next == NULL))
{
return list;
}
LNODE *pre = list;
LNODE *cur = list->next;
LNODE *tmp = NULL;
pre->next = NULL;
while(NULL != cur->next)
{
/*tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;*/
tmp = cur;
cur = cur->next;
tmp->next = pre;
pre = tmp;
}
cur->next = pre;
return cur;
}
//递归将一个单链表反序:new是已经逆序的,old是原有的
//LinkList reverse(LinkList oldlist, LinkList newlist = NULL)
//{
// if((oldlist == NULL) || (oldlist->next == NULL))
// {
// oldlist->next = newlist;
// return oldlist;
// }
//
// LNODE *tmp = oldlist;
//
// oldlist = oldlist->next;
// tmp->next = newlist;
// newlist = tmp;
//
// return reverse(oldlist, newlist);
//}
//单循环链表:尾指针指向头结点
//遍历整个链表
void traversal(LinkList list)
{
if (list == NULL)
{
return;
}
LNODE *cur = list;
while(NULL != cur)
{
printf("%d\t", cur->data);
cur = cur->next;
}
}
void main()
{
LNODE *node, node1, node2, node3, node4, node5, node6, node7;
node1.data = 1;
node2.data = 2;
node3.data = 3;
node4.data = 4;
node5.data = 5;
node6.data = 6;
node7.data = 7;
node1.next = &node2;
node2.next = &node3;
node3.next = &node4;
node4.next = &node5;
node5.next = &node6;
node6.next = &node7;
node7.next = NULL;
//求中间结点
node = middle(&node1);
printf("middle NODE: %d\n", node->data);
puts("\n");
//链表反序
puts("链表反序");
traversal(&node1);
puts("\n");
reverse(&node1);
traversal(&node7);
puts("\n");
}