Leetcode打卡#day3

203. 移除链表元素

//添加虚拟结点法  
ListNode* removeElements(ListNode* head, int val) {
      ListNode *vNode = new ListNode();//申请头结点
      ListNode *tmp, *p;
      vNode->next = head;
      p = vNode;
      while(p->next){
          if (p->next->val == val) {
              tmp = p->next;
              //不移动到下一个结点,下一个结点的val==val
              p->next = tmp->next;
              delete tmp;
          }else{
              //移动到下一个结点
              p = p->next;
          }
      }
      return vNode->next;
  }
//不带头结点的情况  
ListNode* removeElements(ListNode* head, int val) {
      ListNode *p, *q;
      //处理头结点为val的情况
      while(head && head->val == val) head = head->next;
      //处理其他情况
      p = head;
      while(p && p->next) {
          if (p->next->val == val) {
              q = p->next;
              p->next = q->next;
              delete q;
          }else {
              p = p->next;
          }
      }
      return head;
  }

707. 设计链表

public:
  //构建结点
  struct ListNode{
      int val;
      ListNode *next;
      ListNode(int val):val(val), next(nullptr) {}
  };
  //初始化
  MyLinkedList() {
      //设置一个头结点并将值初始化为0,方便op
     _head = new ListNode(0);
     _size = 0;
  }

  int get(int index) {
      //index非法, 返回-1
      if (index < 0 || index > _size-1) return -1;
      ListNode *p = _head->next;
      while(index--) p = p->next;
      return p->val;
  }

  void addAtHead(int val) {
      ListNode *p = new ListNode(val);
      p->next = _head->next;
      _head->next = p;
      _size++;
  }
	//有可能是第0个 所以不能是 q = _head->next!
  void addAtTail(int val) {
      ListNode *p = new ListNode(val);
      ListNode *q = _head;
      //找到最后一个元素
      while (q->next) q = q->next;
      q->next = p;
      _size++;
  }

  void addAtIndex(int index, int val) {
      //等于长度,加到队尾
      if (index > _size) return;
      if (index < 0) index = 0;
      ListNode *newNode = new ListNode(val);
      ListNode *p = _head;
      while(index){
          p = p->next;
          index--;
      }
      newNode->next = p->next;
      p->next = newNode;
      _size++;
  }

  void deleteAtIndex(int index) {
      if (index < 0 || index > _size-1) return;
      ListNode *p = _head, *q;
      while(index--) p = p->next;
      q = p->next;
      p->next = q->next;
      delete q;
      _size--;
  }
  private:
  ListNode *_head;
  int _size;
};

206. 反转链表

       ListNode* reverseList(ListNode* head) {
            ListNode *p, *q;
            //如果头结点为空,直接返回
            if (head == NULL || head->next == NULL) return head;
            //如果不为空
            p = head->next;
            head->next = NULL;
            //头插法
            while(p){  
                q = p->next;
                p->next = head;
                head = p;       
                p = q;
            }
            return head;
        }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值