单链表的面试题---找到链表的中间节点--找到链表的倒数第K个节点

第一题:找到单链表的中间节点(且时间复杂度为O(1))

快慢指针的方法:两个指针同时从头结点出发,快指针一次走2步,慢指针一次走1步,当快指针走完所有节点时,慢指针就恰好是该单链表的中间节点。(要注意单链表的长度是奇数还是偶数)

第二题:找到链表的倒数第K个节点(时间复杂度为O(1))

同样使用两个指针:让其中一个指针先走K步,然后让两个指针一起走。当先走的那个指针走完链表是,后出发的那个指针就是倒数第K个节点。倒数第K个节点也就是正数第单链表个数-K个节点。

下面是代码的实现:

LinkListTest.h文件

#pragma once

#define TextHeader printf("\n********************%s**********************\n",__FUNCTION

typedef char ElemType;
typedef struct LinkListT
{
	ElemType data;
	struct LinkListT* next;
}LinkListT;

LinkListT* head;

//初始化单链表
void LinkListT_Init(LinkListT** head);

//打印链表
void DisplayLinkListT(LinkListT* head);

//找到中间节点
LinkListT* FindMidNode(LinkListT* head); 

//尾插
LinkListT* LinkListT_PushBack(LinkListT** head,ElemType value);

// 找到倒数第 K 个节点. 
LinkListT* FindLastKNode(LinkListT* head, int K);

//创建一个节点
LinkListT* CreateNode(ElemType value);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值