学习链表基础知识

001 初始化

struct ListNode{
        
        int val = 0;
        ListNode *next = nullptr;
        ListNode(){}
        ListNode(int x){val = x;}
    };
    
    ListNode dummy;
    ListNode* tail = nullptr;
    int length = 0;

新建一个dummy头,tail结点指向dummy;

 MyLinkedList() {
        tail = &dummy;
    }

002 尾部插入结点

tai结点的next指针指向新的节点,并且tail指针往后移

 void addAtTail(int val) {
        tail->next = new ListNode(val);
        tail = tail->next;
        length++;
    }

003 头部插入结点

新节点的next指针指向dummy的next指针指向的节点,并且更新dummy的next指针指向心节点;如果tail和dummy指向同一个节点那么。tail指针指向心的节点

void addAtHead(int val) {
         ListNode *p = new ListNode(val);
        p->next = dummy.next;
        dummy.next = p;
        // NOTE change tail
        if (tail == &dummy) {
            tail = p;
        }
        length++;
    }

004 查找结点

这里需要判断列表的边界 如果index 小于0 或者大于等于length 就返回-1

   int get(int index) {
        
        if (index < 0 || index >= length) {
            return -1;
        }
        return getPreNode(index)->next->val;
    }

005 插入指定位置之前

这里也需要对链表的index边界进行判断

如果index 大于长度 返回空;如果index等于长度那么插入尾部;如果index小于等于0 那么插入头部,最后就是处理一般情况

一般情况下需要获取index之前的pre结点,新的节点next指向pre的next;per的next指向心的节点

void addAtIndex(int index, int val) {
        if (index > length) {
            return;
        } else if (index == length) {
            addAtTail(val);
            return;
        } else if (index <= 0) {
            addAtHead(val);
            return;
        }
        ListNode *pre = getPreNode(index);
        ListNode *p = new ListNode(val);
        p->next = pre->next;
        pre->next = p;
        // NOTE: here tail has been changed
        length++;
        
    }

006 删除结点

要对删除的边界点进行判断;如果index小于0或者大于等于长度(在头尾删除) 就没不要删除操作

如果是要删除最后一个节点只需要改变tail的指向;删除操作就是将pre的next指针跨过要删除的节点

void deleteAtIndex(int index) {
        if (index <0 || index>= length) {
            return;
        }
        ListNode *pre = getPreNode(index);
        if (tail == pre->next) {
            tail = pre;
        }
        
        length--;
        
        pre->next = pre->next->next;
    }

题目

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值