链表

寻找单链表的中间结点

#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;
}

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);

}

单链表反序
#include <stdio.h>

typedef int ElemType;

typedef struct LNODE  
{
	ElemType data;
	struct LNODE *next;
}LNODE, *LinkList;

//将一个单链表反序:从头部开始
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;

	traversal(&node1);
	puts("\n");
	reverse(&node1);
	traversal(&node7);
	puts("\n");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值