ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LeetCode.707.设计链表

LeetCode.707.设计链表 题目你可以选择使用单链表或者双链表设计并实现自己的链表。单链表中的节点应该具备两个属性val和next。val是当前节点的值next是指向下一个节点的指针/引用。如果是双向链表则还需要属性prev以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。实现MyLinkedList类MyLinkedList()初始化MyLinkedList对象。int get(int index)获取链表中下标为index的节点的值。如果下标无效则返回-1。void addAtHead(int val)将一个值为val的节点插入到链表中第一个元素之前。在插入完成后新节点会成为链表的第一个节点。void addAtTail(int val)将一个值为val的节点追加到链表中作为链表的最后一个元素。void addAtIndex(int index, int val)将一个值为val的节点插入到链表中下标为index的节点之前。如果index等于链表的长度那么该节点会被追加到链表的末尾。如果index比长度更大该节点将 不会插入 到链表中。void deleteAtIndex(int index)如果下标有效则删除链表中下标为index的节点。这题就是实现链表的增删改查也是梦回高中了本题也是沿用了虚拟头节点其他的一切正常注意边界即可。还是要熟练链表结构体的写法这样才不会只会写业务逻辑代码class MyLinkedList { public: struct LinkedNode { int val; LinkedNode* next; LinkedNode(int val):val(val), next(nullptr){} }; LinkedNode* dummyHead; int size; MyLinkedList() { dummyHead new LinkedNode(0); // 定义一个虚拟头结点 size 0; } int get(int index) { if (index (size - 1) || index 0) return -1; LinkedNode* cur dummyHead - next; while (index--) { cur cur - next; } return cur-val; } void addAtHead(int val) { LinkedNode* head new LinkedNode(val); head - next dummyHead - next; dummyHead - next head; size; } void addAtTail(int val) { LinkedNode* newNode new LinkedNode(val); LinkedNode* cur dummyHead; //防止空链表死循环 int length size; while (length--) { cur cur- next; } cur - next newNode; size; } void addAtIndex(int index, int val) { if (index size || index 0) return; LinkedNode* newNode new LinkedNode(val); LinkedNode* cur dummyHead; //防止空链表死循环 int length index; while (length--) { cur cur- next; } newNode - next cur - next; cur - next newNode; size; } void deleteAtIndex(int index) { if (index (size - 1) || index 0) return; LinkedNode* cur dummyHead; while(index--) { cur cur - next; } cur - next cur - next -next; size--; } };
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进