链接:https://leetcode.cn/problems/design-linked-list/solution/xu-by-xun-ge-v-l7kr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
示例
思路
解题思路
设计链表并实现基本功能应该是入门数据结构的基础吧
简单链表需要实现的四大基本功能:
- 增
//将值为 val 的节点追加到链表的index位置
void myLinkedListAddAtMid(MyLinkedList* obj, int index, int val)
{
obj->len++;
while(index--)
{
obj = obj->next;
}
MyLinkedList * n = malloc(sizeof(MyLinkedList));
n->val = val;
n->next = obj->next;
obj->next = n;
return;
}
- 删
//如果索引 index 有效,则删除链表中的第 index 个节点。
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
if(obj->len > index)
{
obj->len--;
while(index--)
{
obj = obj->next;
}
MyLinkedList * n = obj->next;
obj->next = obj->next->next;
free(n);
}
return;
}
- 改
//修改 index 节点的值为 val
void myLinkedList(MyLinkedList* obj, int index, int val)
{
while(index--)
{
obj = obj->next;
}
obj->next->val = val;
return;
}
- 查
//获取链表中第 index 个节点的值。如果索引无效,则返回-1。
int myLinkedListGet(MyLinkedList* obj, int index) {
if(obj->len > index)
{
while(index--)
{
obj = obj->next;
}
return obj->next->val;
}
return -1;
}
对于本题并没有让我们实现改,其实也可以实现一下,毕竟这个也是基本功能
代码
typedef struct MyLinkedList{
int val;
int len;
struct MyLinkedList * next;
} MyLinkedList;
//打印链表值
void my_printf(MyLinkedList * obj)
{
while(obj->next)
{
printf("%d ", obj->next->val);
obj = obj->next;
}
printf("\n");
return;
}
//初始化
MyLinkedList* myLinkedListCreate() {
MyLinkedList * obj = malloc(sizeof(MyLinkedList));
obj->len = 0;
obj->next = NULL;
return obj;
}
//修改 index 节点的值为 val
void myLinkedList(MyLinkedList* obj, int index, int val)
{
while(index--)
{
obj = obj->next;
}
obj->next->val = val;
return;
}
//获取链表中第 index 个节点的值。如果索引无效,则返回-1。
int myLinkedListGet(MyLinkedList* obj, int index) {
if(obj->len > index)
{
while(index--)
{
obj = obj->next;
}
return obj->next->val;
}
return -1;
}
//在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
obj->len++;
MyLinkedList * node = malloc(sizeof(MyLinkedList));
node->val = val;
node->next = obj->next;
obj->next = node;
return;
}
//将值为 val 的节点追加到链表的最后一个元素
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
MyLinkedList * node = malloc(sizeof(MyLinkedList));
obj->len++;
node->val = val;
node->next = NULL;
while(obj->next)
{
obj = obj->next;
}
obj->next = node;
return;
}
//将值为 val 的节点追加到链表的index位置
void myLinkedListAddAtMid(MyLinkedList* obj, int index, int val)
{
obj->len++;
while(index--)
{
obj = obj->next;
}
MyLinkedList * n = malloc(sizeof(MyLinkedList));
n->val = val;
n->next = obj->next;
obj->next = n;
return;
}
//在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
if(index == obj->len)
{
myLinkedListAddAtTail(obj, val);
}
else if(index < 0)
{
myLinkedListAddAtHead(obj, val);
}
else if(index < obj->len)
{
myLinkedListAddAtMid(obj, index, val);
}
return;
}
//如果索引 index 有效,则删除链表中的第 index 个节点。
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
if(obj->len > index)
{
obj->len--;
while(index--)
{
obj = obj->next;
}
MyLinkedList * n = obj->next;
obj->next = obj->next->next;
free(n);
}
return;
}
//销毁链表
void myLinkedListFree(MyLinkedList* obj) {
while(obj)
{
MyLinkedList * n = obj;
obj = obj->next;
free(n);
}
return;
}
/**
* Your MyLinkedList struct will be instantiated and called as such:
* MyLinkedList* obj = myLinkedListCreate();
* int param_1 = myLinkedListGet(obj, index);
* myLinkedListAddAtHead(obj, val);
* myLinkedListAddAtTail(obj, val);
* myLinkedListAddAtIndex(obj, index, val);
* myLinkedListDeleteAtIndex(obj, index);
* myLinkedListFree(obj);
*/
作者:xun-ge-v
链接:https://leetcode.cn/problems/design-linked-list/solution/xu-by-xun-ge-v-l7kr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。