打卡六十天:第四天 第二章 链表part01

● 链表理论基础

单链表
双链表
循环链表
定义链表

struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};

● 203.移除链表元素

第一次写的错误代码,无法运行,我的具体思路就是再建一个链表,然后保存住head头结点的位置,其实这里还需要判断一下头结点是否更改了,如果更改了的话那保存head的s2也是需要更改的,但是程序一点都运行不了,看一下正确答案
【错误无法运行版】

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode * s1,s2;
        s1=head->next;
        s2=head;
        for(;head!=NULL;head=head->next)
        if(head.val==val)
    {
        sl=head->next;

    }
return head;
    }
};

【标准答案】
思路一:
直接在原表上进行删除操作
首先需判断头结点是不是可删元素。若是,直接新令一个节点等于head->next,若不是还需要保存一下头结点。

class Solution{
public:
ListNode *removeElements(ListNode *head ,int val){
while(head!=NULL&&head->val==val)//如果头结点不是0,并且对应的值是val,开始觉得这个地方不一定必须是while,可以用if,但是用哪个if出错了,说明它不仅可以判断头结点,也可以判断删除头结点后的新的头结点是不是需要删除的数
{
ListNode * tmp = head;//建立一个新的节点,等于头结点
head=head->next;//头结点等于它的下个节点
delete tmp;//删除tmp, 那建立它干啥呢,直接令head=head->next不行吗(这里保存应该就是为了后期释放的,因为c++不支持自己释放,需要手动释放)
}
ListNode *cur head;//保存头结点
while(cur !=NULL&&cur->next!=NULL)
{if(cur->next->val==val)//如果cur下一个数对应的值是val
{
ListNode *tem =cur->next;//这里也用tmp存一下需要删除的节点
cur->next=cur->next->next;//越过中间连接到下一个节点上
delete temp;//释放空间
}
else
{cur = cur -> next;//继续循环
}
}
return head;
}

根据思路重新写的

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
     
     while(head!=NULL&&head->val==val)
     {
         ListNode* tmp;
         tmp= head;
         head = head->next;
         delete tmp;
     }

 ListNode*cur=head;
 ListNode* p1=head;
     while(cur!=NULL)
     {
         if(cur->val==val)
      {
          ListNode* tmp=cur;
          p1->next=cur->next;
          cur=cur->next;
      delete tmp;
      }
      else
      {
          p1=cur;
          cur=cur->next;
      }
     }
     return head;
    }
};

● 707.设计链表

就是实际一些链表相关的功能函数,感觉挺简单的,但是写不出来…
【标准答案】

class MyLinkedList {//自己设计一个链表
public:
    MyLinkedList() {
        this->size = 0;
        this->head = new ListNode(0);
    }
    
    int get(int index) {
        if (index < 0 || index >= size) {
            return -1;
        }
        ListNode *cur = head;
        for (int i = 0; i <= index; i++) {
            cur = cur->next;
        }
        return cur->val;
    }
    
    void addAtHead(int val) {
        addAtIndex(0, val);
    }
    
    void addAtTail(int val) {
        addAtIndex(size, val);
    }
    
    void addAtIndex(int index, int val) {
        if (index > size) {
            return;
        }
        index = max(0, index);
        size++;
        ListNode *pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred->next;
        }
        ListNode *toAdd = new ListNode(val);
        toAdd->next = pred->next;
        pred->next = toAdd;
    }
    
    void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }
        size--;
        ListNode *pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred->next;
        }
        ListNode *p = pred->next;
        pred->next = pred->next->next;
        delete p;
    }
private:
    int size;
    ListNode *head;
};

● 206.反转链表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值