707 链表设计

#include<iostream>

using namespace std;

typedef struct ListNode

{

int val;

struct ListNode* next;

}ListNode;

//创建

ListNode* ListCreate()

{

ListNode* head = (ListNode*)malloc(sizeof(ListNode));

head->next = NULL;

return head;

}

//尾部添加

void AddAtTail(ListNode* obj, int val)

{

ListNode* cur = obj;

while(cur->next != NULL)

{

cur = cur->next;

}

ListNode* nTail = (ListNode*)malloc(sizeof(ListNode));

nTail->val = val;

nTail->next = NULL;

cur->next = nTail;

}

//头部添加

void AddAtHead(ListNode* obj, int val)

{

ListNode* nhead = (ListNode*)malloc(sizeof(ListNode));

nhead->val = val;

nhead->next = obj->next;

obj->next = nhead;

}

//指定索引处添加

void AddAtIndex(ListNode* obj, int index, int val)

{

if(index == 0)

{

AddAtHead(obj, val);

return;

}

ListNode* cur = obj->next;

for(int i = 1; cur != NULL; i++)

{

if(i == index)

{

ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));

newNode->val = val;

newNode->next = cur->next;

cur->next = newNode;

return;

}

else

{

cur = cur->next;

}

}

}

//指定索引处删除

void DeleteAtIndex(ListNode* obj, int index)

{

if(index == 0)

{

ListNode* tmp = obj->next;

if(tmp != NULL)

{

obj->next = tmp->next;

free(tmp);

}

return;

}

ListNode* cur = obj->next;

for(int i = 1; cur != NULL && cur->next != NULL; i++)

{

if(i == index)

{

ListNode* tmp = cur->next;

if(tmp != NULL)

{

cur->next = tmp->next;

free(tmp);

}

return;

}

else

{

cur = cur->next;

}

}

}

//全部删除

void ListFree(ListNode* obj)

{

while(obj != NULL)

{

ListNode* tmp = obj;

obj = obj->next;

free(tmp);

}

obj->next = NULL;

}

//修改指定索引的值

void ChangeAtIndex(ListNode* obj, int index, int val)

{

ListNode* cur = obj->next;

for(int i = 0; cur != NULL; i++)

{

if(i == index)

{

cur->val = val;

return;

}

else

{

cur = cur->next;

}

}

}

//查询指定位置的值

int CheckAtIndex(ListNode* obj, int index)

{

ListNode* cur = obj->next;

for(int i = 0; cur != NULL; i++)

{

if(i == index)

{

return cur->val;

}

else

{

cur = cur->next;

}

}

}

int main()

{

ListNode* head = ListCreate();

for(int i = 1; i < 10; i++)

{

//在尾部添加

AddAtTail(head, i);

}

ListNode* obj = head->next;

while(obj != NULL)

{

cout << obj->val << endl;

obj = obj->next;

}

//测试在头部添加

//AddAtHead(head, 100);

//测试在指定位置3添加

//AddAtIndex(head, 3, 300);

//测试在指定位置0添加

//AddAtIndex(head, 0, 0);

//测试在指定位置删除

//DeleteAtIndex(head, 3);

//测试修改指定位置数据

//ChangeAtIndex(head, 3, 0);

//测试查询指定位置的值

int Data = CheckAtIndex(head, 3);

cout << "data = " << Data << endl;

ListNode* obj1 = head->next;

while(obj1 != NULL)

{

cout << obj1->val << endl;

obj1 = obj1->next;

}

return 0;

}

相关推荐
韭菜炒大葱33 分钟前
前端经典面试题:从 URL 输入到页面展示,中间经历了什么?
前端·http·面试
swipe40 分钟前
纯函数、柯里化与函数组合:从原理到源码,构建更可维护的前端代码体系
前端·javascript·面试
远山枫谷41 分钟前
uniapp + Vue 自定义组件封装:自定义样式从入门到实战
前端·vue.js
Lee川1 小时前
JavaScript 中的 `this` 与变量查找:一场关于“身份”与“作用域”的深度博弈
前端·javascript·面试
Kakarotto3 小时前
Canvas 直线点击事件处理优化
javascript·vue.js·canvas
顺遂3 小时前
基于Rokid CXR-M SDK的引导式作业辅导系统设计与实现
前端
代码搬运媛3 小时前
Generator 迭代器协议 & co 库底层原理+实战
前端
前端拿破轮3 小时前
从0到1搭建个人网站(三):用 Cloudflare R2 + PicGo 搭建高速图床
前端·后端·面试
功能啥都不会3 小时前
PM2 使用指南 - 踩坑记录
前端
HelloReader3 小时前
React 中 useState、useEffect、useRef 的区别与使用场景详解,终于有人讲明白了
前端