一,循环单链表的代码实现:
//单循环链表
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。