第一题:找到单链表的中间节点(且时间复杂度为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);