链表真的很重要,先把基本操作再熟悉熟悉
while(index–)和while(–index)的区别在文章的最后
1.原题
简单来说就是设计一个链表,实现6个接口
1. 获取链表的第index个节点的数值,如果下标无效就返回-1;
2. 在链表的最前面插入一个节点
3. 在链表的最后面插入一个节点
4. 在链表的第index个节点的前面插入一个节点,如果index等于链表的长度,该节点追加到链表末尾,如果index大于链表长度,该节点不会插入到链表中;
5. 删除链表的第index个节点。
2.思路和代码
先定义链表结构体并初始化链表
//定义链表节点的结构体
struct LinkedNode{
int val;
LinkedNode *next;
LinkedNode(int val):val(val),next(NULL){}
};
//初始化链表
MylinkedNode(){
//定义一个虚拟头节点,而不是真正的链表头节点
_dummyHead = new LinkedNode(0);
_size = 0;
}
1.获取链表的第 index 个节点的数值,如果下标无效就返回-1;
//获取第index个节点的数值,如果index是非法数值则返回-1,
//index是从0开始的,第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;
}
2.在链表的最前面插入一个节点
//在链表最前面插入一个节点,插入完成后,新插入的节点就是链表新的头节点
void addAtHead(int val) {
LinkedNode *newNode = new LinkedNode(val);
newNode->next = dummyHead->next;
dummyHead->next = newNode;
_size++;
}
3.在链表最后添加一个节点
实际上就是插入节点的操作,只是多了一个找到最后一个节点的步骤
void addAtTail(int val) {
LinkedNode *newNode = new LinkedNode(val);
LinkedNode *cur = dummyHead;
while(cur->next != NULL)
{
cur = cur -> next;
}
cur->next = newNode;
_size++;
}
4.在链表的第index个节点的前面插入一个节点,如果index等于链表的长度,该节点追加到链表末尾,如果index大于链表长度,该节点不会插入到链表中
- 在第index个节点之前插入一个新节点
- 如果index为0,则新插入的节点为链表的新头节点
- 如果index等于链表的长度,则说明新插入的节点是链表的尾结点
- 如果index大于链表的长度,则返回空
void addAtIndex(int index, int val) {
if(index > _size)
{
return;
}
LinkedNode *newNode = new LinkedNode(val);
LinkedNode *cur = dummyHead;
while(index--)
{
cur = cur->next;
}
newNode -> next = cur->next;
cur -> next = newNode;
_size++;
}
5.删除第index个节点
如果 index 大于等于 链表长度,则直接返回
void deleteAtIndex(int index) {
if(index >= _size || index < 0)
{
return;
}
LinkedNode *cur = dummyHead;
while(index--)
{
cur = cur->next;
}
LinkedNode *tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
//delete释放了tmp指针原本指向的那部分内存,被delete后的指针tmp的地址并非是NULL,而是随机值
//如果被delete后不加上tmp=NULL; tmp会变成野指针
tmp = NULL;
_size--;
}
3.整体代码
class MyLinkedList {
public:
struct LinkedNode{
int val;
LinkedNode *next;
LinkedNode(int val) : val(val),next(NULL){}
};
MyLinkedList() {
dummyHead = new LinkedNode(0);
_size = 0;
}
//获取第index个节点的数值,如果index是非法数值则返回-1,
//index是从0开始的,第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 *newNode = new LinkedNode(val);
newNode->next = dummyHead->next;
dummyHead->next = newNode;
_size++;
}
void addAtTail(int val) {
LinkedNode *newNode = new LinkedNode(val);
LinkedNode *cur = dummyHead;
while(cur->next != NULL)
{
cur = cur -> next;
}
cur->next = newNode;
_size++;
}
void addAtIndex(int index, int val) {
if(index > _size)
{
return;
}
LinkedNode *newNode = new LinkedNode(val);
LinkedNode *cur = dummyHead;
while(index--)
{
cur = cur->next;
}
newNode -> next = cur->next;
cur -> next = newNode;
_size++;
}
void deleteAtIndex(int index) {
if(index >= _size || index < 0)
{
return;
}
LinkedNode *cur = dummyHead;
while(index--)
{
cur = cur->next;
}
LinkedNode *tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
//delete释放了tmp指针原本指向的那部分内存,被delete后的指针tmp的地址并非是NULL,而是随机值
//如果被delete后不加上tmp=NULL; tmp会变成野指针
tmp = NULL;
_size--;
}
void printLinkedNode()
{
LinkedNode *cur = dummyHead;
while(cur->next != NULL)
{
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
private:
int _size;
LinkedNode *dummyHead;
};
4.while(index–)和while(–index)
简单来说,while(index–)就是判断index,再减减,while(–index)就是判断index-1。
拿 index=3 和 index=0 为例
while(–index)
index = 3
index = 0
while(index–)
index = 3
index = 0