链表相关

链表逆转

双指针

  1. pre指针指向上一个节点,cur指向当前节点,用temp指向cur的下一个节点
  2. curnext指向pre
  3. pre指向cur,再cur指向temp
  4. cur为空退出循环
void reverseLinkedList(listNode *head){
	listNode *pre=nullptr;
	listNode *cur=head->next;
	listNode *tmep=nullptr;
	while(cur){
		temp=cur->next;
		cur->next=pre;
		pre=cur;
		cur=temp;
	}
	head->next=pre;
}

快慢指针

要找到链表中倒数第k个节点

  1. fast指针指向链表中第k+1个节点,slow指向链表中第1个节点
  2. fastslow同时往下遍历
  3. fast为空退出循环,此时slow为倒数第k个节点
listNode find(listNode *head){
	listNode *fast=head->next;
	listNode *slow=head->next;
	for(int i=0;i<k;i++){
		fast=fast->next;
		if(!fast){
			cout<<"error"<<endl;
			return nullptr;
		}
	}
	while(fast){
		fast=fast->next;
		slow=slow->next;
	}
	return slow;
}

静态链表

用数组存储,指针域存下一个节点的下标,下标0表示空

结构

struct listNode{
	DataType data;    //数据域
	int next;    //指针域
};

struct staticList{
	int capacity;    //数组长度-1
	int size;    //表中节点个数
	listNode *nodes;
	int first;    //第一个节点的下标
}

跳表

有序链表实现二分查找

  • 一个跳表有(logN)层链表,上一层链表节点数是下一层节点数的1/2
  • 最底层的是原始链表,包含所有数据
  • 每层链表都是有序的
  • 上层的节点的其中一个指针域指向下层相同值的节点
  • head->next指向最上层第一个节点
posted @ 2026-04-04 09:21  mofei1116  阅读(9)  评论(0)    收藏  举报