c语言实现链表面试题

本文详细介绍了13道关于链表的C语言面试题目,包括链表的逆序打印、删除非尾节点、插入节点、逆置链表、约瑟夫环、冒泡排序、找中间节点、有序合并、判断链表环、求环长度、环的入口点以及两环相交等。每道题目都包含思路分析、实现代码及测试代码。
摘要由CSDN通过智能技术生成

   以前实现过链表的简单函数,详细见http://blog.csdn.net/dove1202ly/article/details/77168657

      今天我们来看看链表涉及的面试题相信大家都知道单链表面试题的重要性,既然知道,我们就应该把思路捋清楚,然后多敲几遍多敲几遍多敲几遍(重要的事情说三遍微笑),在我身边好多编程好的把这几个函数敲了不下十遍,而我太菜,这才是第一次下定决心把这个整理出来,如果有不对的地方,请多多指正,谢谢(^U^)ノ~YO吐舌头

首先定义一个节点结构体:

typedef int DataType;
typedef struct ListNode
{
	DataType data;
	struct ListNode* next;
} ListNode;

1.链表的逆序打印(递归实现)

思路分析:

实现代码:

void Reverse(ListNode* plist)
{
	if (plist == NULL)
	{
		return;
	}
	else if (plist != NULL)
	{
		Reverse(plist->next);
		printf("%d-->", plist->data);
	}
}

测试代码:

void Test1()// Reverse
{
	ListNode* list = NULL;
	PushFront(&list, 1);
	PushFront(&list, 2);
	PushFront(&list, 3);
	PushFront(&list, 4);
	Display(list);

	Reverse(list);
	Destroy(&list);
}

2、删除无头链表的非尾节点

思路分析:

实现代码:

void RemoveNotHead(ListNode** ppList, DataType x)//删除无头链表的非尾节点
{
	ListNode* del = NULL;
	ListNode* cur = Find(*ppList, x);
	assert(ppList);
	if (cur == NULL)
	{
		return;
	}
	del = cur->next;
	cur->data = del->data;
	cur->next = del->next;
	free(del);
}

测试代码:

void Test2()//RemoveNotHead
{
	ListNode* list = NULL;
	PushFront(&list, 1);
	PushFront(&list, 2);
	PushFront(&list, 3);
	PushFront(&list, 4);
	Display(list);
	RemoveNotHead(&list, 3);
	Display(list);
	Destroy(&list);
}

3、在无头单链表的一个节点前插入一个节点

思路分析:

实现代码:

void InsertNonFront(ListNode* pos, DataType x)
{
	ListNode* cur = pos->next;
	ListNode* tmp = BuyNode(x);
	DataType _tmp;
	assert(pos);
	pos->next = tmp;
	tmp->next = cur;
	_tmp = pos->data;//交换tmp与pos的值
	pos->data = tmp->data;
	tmp->d
  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值