D6 707.设计链表
707 设计链表(力扣:https://leetcode.cn/problems/design-linked-list/
条件: 见原题链接
Tips:
代码:
点击查看代码
struct ListNode{
int val;
ListNode* prev;
ListNode* next;
//使用初始化列表
ListNode( int num ) : val(num), prev(nullptr), next(nullptr){}
};
//结构体结束的分号不要丢
class MyLinkedList {
private:
ListNode* head;
int size;
public:
MyLinkedList() {
head = nullptr;
size = 0;
}
int get(int index) {
if( index >= size){
return -1;
}
ListNode* current = head;
for(int i = 0; i < index; i++){
current = current->next;
}
//current是指针,要用->而非.
return current->val;
}
//极端情况是空链表,不要忘记
void addAtHead(int val) {
//创建值为val的新节点
ListNode* newHead = new ListNode(val);
if( head = nullptr){
head = newHead;
}else{
//这里只用把新head和旧head的指针更新
newHead->next = head;
head->prev = newHead;
head = newHead;
}
size++;
}
//空链表要考虑
void addAtTail(int val) {
ListNode* newTail = new ListNode(val);
if(head = nullptr){
head = newTail;
}else{
ListNode* current = head;
//这里用while遍历更高效,因为尾部的特点是next一定为nullptr
while( current->next != nullptr ){
current = current->next;
}
current->next = newTail;
newTail->prev= current;
size++;
}
}
void addAtIndex(int index, int val) {
//void函数不能break
if(index >= size){
return;
//头尾用成员函数
}else if( index == 0 ){
addAtHead(val);
}else if( index == size){
addAtTail(val);
}
else{
ListNode* current = head;
//不需要节点内再定义一个index
//for这里按顺序遍历到的i自然对应节点的排位
for(int i = 0; i < index - 1; i++){
current = current->next;
}
ListNode* newNode = new ListNode(val);
newNode->next = current;
current->prev = newNode;
if(current->next != nullptr){
current->next->prev = newNode;
}
current->next = newNode;
size++;
}
}
void deleteAtIndex(int index) {
if (index < 0 || index >= size) {
return; // 无效索引
}
if (index == 0) { // 删除头节点
ListNode* toDelete = head;
head = head->next;
if (head != nullptr) {
head->prev = nullptr;
}
delete toDelete;
} else {
// 找到第index-1个节点
ListNode* current = head;
for (int i = 0; i < index - 1; i++) {
current = current->next;
}
ListNode* toDelete = current->next;
current->next = toDelete->next;
if (toDelete->next != nullptr) {
toDelete->next->prev = current;
}
delete toDelete;
}
size--;
}
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
浙公网安备 33010602011771号