数据结构学习日记(六)

一,循环单链表的代码实现:

//单循环链表 
typedef struct CNode{
  int data;
  struct CNode *next;	
}CNode,*CList;
#pragma once
//循环链表,尾节点next保存头结点地址

typedef struct CNode
{
	int data;
	struct CNode *next;
}CNode,*CList;

//1,初始化 
void InitList(CList L){
	assert(L!=NULL)//如果L为空,则终止程序 
	if(L==NULL){
		return;
	}
	L->next=L;
} 
//判断是否为空
bool IsEmepty(CList L){
	return (L->next==L);
} 
//2,头插法
bool Insert_head(CList &L,int val){
	CNode *p=(CNode *)malloc(sizeof(CNode));
	p->data=val;
	p->next=L->next;
	L->next=p;
	return true;
}
//3,尾插法 
bool Insert_tail(CList &L,int val){
	CNode *p;
	for(p=L;p->next!=L;p=p->next);
	CNode *q=(CNode *)malloc(sizeof(CNode));
	q->data=val;
	q->next=p->next;
	p->next=q;
	return true;
}
//4,查找
CNode *Search(CList &L,int val){
	for(CNode *p=L->next;p!=L;p=p->next){//p->next不等于头结点,则循环未结束。 
		if(p->data==val){
			return p;
		}
	}
	return NULL;
} 
//5,获取前驱
CNode *Getprio(CList &L,int val){
	for(CNode *p=L;p->next!=L;p=p->next){
		if(p->next->data==val){
			return p;
		}
		return NULL;
	}
}
//6,获取后继
CNode *GetNext(CList &L,int val){
	CNode *p=Search(L,val);
	if(p==NULL&&p->next==L){
		return NULL;
	}
	return p->next;
} 
//7,删除
bool Delete(CList &L,int val){
	CNode *p=Getprio(L,val);
	if(p==NULL){
		return false;
	}
	CNode *q=p->next;
	p->next=q->next;
	free(q);
	return true;
}
//8,求长度
int count(CList &L){
	int count=0;
	for(CList *p=L->next;p!=L;p=p->next){
		count++;
	}
	return count;
} 
//9,打印
 void show(CList &L){
 	for(CNode *p=L->next;p!=L;p=p->next){
 		printf("%d\n",p->data);
	 } 
 } 
 //10,删除
void Destroy(CList plist)
{
	CNode *p;

	while (plist->next != plist)
	{
		p = plist->next;
		plist->next = p->next;
		free(p);
	}
}
void Clear(CList plist)//清空数据
{
	Destroy(plist);
}

 

二,每日一题:剑指 Offer 22. 链表中倒数第 k 个节点

双指针应用:快慢指针

class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode format=head,latter=head;
        for(int i=0;i<k;i++){
            format=format.next;
        }
        while(format!=null){
            format=format.next;
            latter=latter.next;
        }
        return latter;
    }
}

三,理论知识

(1)类中声明的变量有默认初始值;方法中声明的变量没有默认初始值,必须在定义时初始化,否则在访问该变量时会出错。

(2)boolean类型默认值是false,int数组默认是0

(3)抽象类可以定义普通成员变量而接口不可以,但是抽象类和接口都可以定义静态成员变量,只是接口的静态成员变量要用static final public 来修饰。抽象类中可以包含静态方法,接口中不能包含静态方法

(4)接口没有构造方法,所以不能实例化,抽象类有构造方法,但是不是用来实例化的,是用来初始化的。

(5)抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

(6)静态成员变量或静态代码块>main方法>非静态成员变量或非静态代码块>构造方法。

(7)构造方法的方法名与类名相同,构造方法没有返回值类型,也不写void。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值