LeetCode707设计链表
思路:主要是确定,虚拟头节点不算个数,从第一个正式节点开始计数,下标从0开始,这个确定了就写就完了
typedef struct Node // 定义节点
{
int val;
struct Node* next;
} Node;
typedef struct MyLinkedList // 定义链表
{
int size; // 链表中节点的数量
Node* head; // 指向链表头结点的指针
} MyLinkedList;
// 初始化 MyLinkedList
MyLinkedList* myLinkedListCreate()
{
MyLinkedList* obj = (MyLinkedList*)malloc(sizeof(MyLinkedList)); // 定义一个空链表
Node* dummyhead = (Node*)malloc(sizeof(Node)); // 定义一个空节点
dummyhead->next = NULL;
obj->head = dummyhead; // 头结点指向空节点
obj->size = 0; // 设置链表节点数量为 0
return obj;
}
// 获取链表中下标为 index 的节点的值
int myLinkedListGet(MyLinkedList* obj, int index)
{
if (index < 0 || index >= obj->size) // 索引超出范围
return -1;
Node* cur = obj->head->next; // 从头结点的下一个节点开始
while (index--)
{
cur = cur->next;
}
return cur->val;
}
// 在头部插入节点
void myLinkedListAddAtHead(MyLinkedList* obj, int val)
{
Node* newNode = (Node*)malloc(sizeof(Node)); // 分配新节点
newNode->val = val;
newNode->next = obj->head->next; // 新节点指向原头节点
obj->head->next = newNode; // 头节点指向新节点
obj->size++; // 更新链表大小
}
// 在尾部插入节点
void myLinkedListAddAtTail(MyLinkedList* obj, int val)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->val = val;
newNode->next = NULL;
Node* cur = obj->head;
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = newNode;
obj->size++;
}
// 在指定位置插入节点
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val)
{
if (index < 0 || index > obj->size) // 插入位置超出范围
return;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->val = val;
Node* cur = obj->head;
while (index--)
{
cur = cur->next;
}
newNode->next = cur->next;
cur->next = newNode;
obj->size++;
}
// 删除指定位置节点
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index)
{
if (index < 0 || index >= obj->size) // 索引超出范围
return;
Node* cur = obj->head;
while (index--)
{
cur = cur->next;
}
Node* toDelete = cur->next;
cur->next = toDelete->next;
free(toDelete);
obj->size--;
}
// 释放链表
void myLinkedListFree(MyLinkedList* obj)
{
Node* cur = obj->head;
while (cur != NULL)
{
Node* next = cur->next;
free(cur);
cur = next;
}
free(obj);
}