找出单链表的倒数第四个元素大数据面试题2018.01.09

本文介绍了两种算法来找出单链表的倒数第四个元素,包括双指针同步前进和利用数组存储每4个元素。同时,提供了找出链表中间元素的算法,考虑了奇数和偶数个元素的情况。文章还包含示例代码以供理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.找出单链表的倒数第4个元素
这道题目有两种算法,但无论哪种算法,都要考虑单链表少于4个元素的情况:第一种情况,建立两个指针,第一个先走4步,然后第2个指针也开始走,两个指针步伐【前进速度】一致。
static Link GetLast4thOne(Link head)
{
Link first = head;
Link second = head;
for(int i=0;i<4;i++)
{
if(first.Next==null)
throw new Exception(“Less than 4 elements”);
first = first.Next;
}
while(first!=null)
{
first = first.Next;
second = second.Next;
}
return second;
}

第二种算法,做一个数组arr【4】,让我们遍历单链表,把第0个,第四个,第八个。。。。第4N个扔到arr【0】,把第一个,第五个,第9个。。。。第4N+1个扔到arr【1】,把第二个,第六个,第十个。。。。第4N+2个扔到arr【2】,把第三个,第7个,第11个。。。。第4N+3个扔到arr【3】,这样随着单链表的遍历结束,arr中存储的就是单链表的最后4个元素,找到最后一个元素对应的arr【i】,让k=(i+1)%4,则arr【k】就是倒数第4个元素。
static Link GetLast4thOneByArray(Link head)
{
Link curr = head;
int i= 0;
Link[] arr= new Link[4];
while (curr.Next != null)
{
arr[i] = curr.Next;
curr = curr.Next;
i=(i+1)%4;
}
if (arr[i] == null)
throw new Exception(“Less than 4 elements”);
return arr[i];
}
本题目源代码下载:推面广之,对倒数第K个元素,都能用以上2种算法找出来。
3.找出单链表的中间元素
算法思想:类似于上题,还是使用两个指针first和second,只是first每次走一步,second每次走两步:
static Link GetMiddleOne(Link head)
{
Link first = head;
Link second = head;
while(first != null&&first.Next != null)
{
first = first.Next.Next;
second = second.Next;
}
return second;
}
但是,这道题目有个地方需要注意,就是对于链表元素个数成为奇数,以上算法成立,如果链表元素个数为偶数,那么再返回second的同时,还要返回second.Next也就是下一个元素,它俩都算是单链表的中间元素。
下面是加强版的算法,无论奇数偶数,一概通杀;
static void Main(string[] args)
{
Link head = GenerateLink();
bool isOdd = true;
Link middle = GetMiddleOne(head.ref isOdd);
if(isOdd)
{
Console.WriteLine(middle.Data);
}
else
{
Console.WriteLine(middle.Data);
Console.WriteLine(middle.Next.Data);
}
Console.Read();
}
static Link GetMiddleOne(Link head.ref bool isOdd)
{
Link first = head;
Link second = head;
while(first !=null&&first.Next !=null)
{
first = first.Next.Next;
second = second.Next;
}
if (first != null)
isOdd= false;
return second;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值