Day2 707.设计链表

力扣题目链接(opens new window)

题意:

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

707示例

 1.获取第index个节点的数值,如果index是非法的,直接返回-1

int get(int index) {
	
		if(index<0||index>(_size-1)){//保证index的合法性,不能小于0或者不能大于size-1

			return -1;
		}
		LinkedNode* current = _dummyHead->next;//current指向虚拟头结点的下一个节点,即真实的节点;
		while(index){

			current = current->next;
			index--;
		}
		return current->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* current = _dummyHead;
		//只要current的next不为空,那就一直往下找:
		while (current->next!=nullptr)
		{		
			current = current->next;

		}
		//此时current就位末尾元素了;
		current->next = newNode;
		_size++;


	}

4.在第index之前插入一个节点:
    //4.1 index = 0;插入的节点为链表的新头节点;
    //4.2 index等于链表的长度(size),那么新插入的节点为链表的尾节点;
    //4.3 index大于链表的长度,那么返回空;
    //4.4 index小于0,则在头部插入节点:

void addAtIndex(int index,int val ){

		if (index > _size)
			return;
		if (index < 0)
			index = 0;
		LinkedNode * newNode = new LinkedNode(val);
		LinkedNode* current = _dummyHead;
		//这个循环是找到第index个节点:
		while (index) {
			current = current->next;
			index--;
		}
		newNode->next = current->next;
		current->next = newNode;
		_size++;
	
	}

5.删除第index个节点,如果index大于等于链表的长度,直接return;

void deleteAtIndex(int index) {
		if (index<0||index>=_size) {
			return;
		}
		LinkedNode* current = _dummyHead;
		while(index){
			current = current->next;
			index--;

		}
		LinkedNode* temp = current->next;
		current->next = current->next->next;
		//delete temp只是释放了temp指向的内存,但是它并不会删除指针temp本身,temp指着仍然保留着释放掉的内存地址;
		//如果之前被temp指向的内训地址再次被系统使用,那么我们贸然操作temp将是非常危险的;
		//因此将temp设置为空指针(nullptr)可以有效的保护之前temp指向的那块地址,保证它不会被随意使用;
		delete temp;
		temp = nullptr;
		_size--;
	}

6.打印链表

	void printLinkedList() {
		LinkedNode* current = _dummyHead;
		while(current->next != nullptr) {

			cout << current->next->val << " ";
			current = current->next;
		}

		cout << endl;

	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值