【leetcode hot 100之补充】(链表)707 设计链表以及 while(index--)和while(--index)的区别

链表真的很重要,先把基本操作再熟悉熟悉

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大于链表长度,该节点不会插入到链表中

  1. 在第index个节点之前插入一个新节点
  2. 如果index为0,则新插入的节点为链表的新头节点
  3. 如果index等于链表的长度,则说明新插入的节点是链表的尾结点
  4. 如果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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值