首页 > 其他分享 >day03 - 链表part01

day03 - 链表part01

时间:2023-09-11 22:44:06浏览次数:37  
标签:index cur val day03 next 链表 part01 int LinkedNode

力扣203. 移除链表元素

没有难度,只需掌握一个思路,即因为每次删除元素时,我们需要该元素的前一个元素的指针来操作,那么如果删除第一个元素呢?他的前一个元素无法获取因此需要进行特殊处理,而我们可以设置一个虚拟节点作为头结点,这样链表的每个元素的处理方式就统一了。

代码如下

ListNode* removeElements(ListNode* head, int val) {
//设置虚拟头结点
   ListNode* dummyHead = new ListNode(0, head);
   //遍历的当前节点
   ListNode* cur = dummyHead;
   while (cur->next)
  {
       if (cur->next->val == val)
      {
           ListNode* tmp = cur->next;
           cur->next = cur->next->next;
           delete tmp;
      }
       else
      {
           cur = cur->next;
      }
  }
   return dummyHead->next;
}
力扣707. 设计链表

思路还是一样,利用虚拟头结点统一逻辑处理方式,难点在于太复杂了,边界值不清晰,照着答案都得改半天。

代码如下:

class MyLinkedList {
public:
//定义节点结构体
   struct LinkedNode{
       int val;
       LinkedNode* next;
       LinkedNode(int val):val(val), next(nullptr){}
  };

   MyLinkedList() {
       dummyHead_  = new LinkedNode(0);
       size_ = 0;
  }
   //返回index,此时index从0开始
   int get(int index) {
       if (index < 0 || index > (size_ - 1))
      {
           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 != nullptr)
      {
           cur = cur->next;
      }
       cur->next = newNode;
       size_++;
  }
   
   void addAtIndex(int index, int val) {
       if (index < 0 || 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 < 0 || index >= size_)
      {
           return;
      }
       LinkedNode* cur = dummyHead_;
       while(index--)
      {
           cur = cur->next;
      }
       LinkedNode* tmp = cur->next;
       cur->next = cur->next->next;
       delete tmp;
       size_--;
  }
private:
   int size_;
   LinkedNode* dummyHead_;
};

/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
力扣206. 反转链表

思路:因为每次反转时候后面的链表就会丢失,因此先定义一个tmp指针保存后面的链表,然后用双指针逐个反转。

代码

ListNode* reverseList(ListNode* head) {
   ListNode* tmp;
   ListNode* cur = head;
   ListNode* pre = nullptr;
   while (cur)
  {
   tmp = cur->next;
   cur->next = pre;
   pre = cur;
   cur = tmp;
  }
   return pre;
}
 

标签:index,cur,val,day03,next,链表,part01,int,LinkedNode
From: https://www.cnblogs.com/xiaowangshu1/p/17694773.html

相关文章

  • Java有关链表的基本操作
    上一篇发表的数组的基本操作,但是数组有优势也有劣势:·具体的优势是:拥有高效的随机访问能力·劣势是:由于排列紧密相连,插入和删除元素都会导致大量元素被迫移动,影响效率。接下来要阐述的数据结构是链表:·先看看单向链表的结构:单向链表的每一个节点又包含两个部分,一部分......
  • 重排链表
     解题思路:采用快慢指针的方法将单链表分成两半,再对两部分的链表进行合并voidreorderList(structListNode*head){  if(head==NULL||head->next==NULL){    return;  }    //找到链表中间节点  structListNode*slow=head; ......
  • 138. 复制带随机指针的链表
    给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由n个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表......
  • 例2.9 建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放
    1.题目例2.9建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。2.算法分析3.代码/*二进制加1*/voidBinAdd(LinkListl){inttemp;Node*pa=l->next,*pb,*s;while(pa......
  • 例2.7 算法实现带头结点单链表的就地逆置问题。
    1.题目例2.7算法实现带头结点单链表的就地逆置问题。2.算法思想3.代码//就地逆置voidReverseList(LinkListL){Node*p,*q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;......
  • Icoding 链表 删除范围内结点
    题目:已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度。链表结点定义如下:struct_lnklist{ElemTypedata;struct_lnklist*next;};typedefstruct......
  • 链表
            ......
  • java版本剑指offer:链表中倒数最后k个结点
    java版本剑指offer:链表中倒数最后k个结点描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为0的链表。最简单的方式就是使用两个指针,第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针......
  • java版本剑指offer:反转链表
    java版本剑指offer:反转链表描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}此题想考察的是:如何调整链表指针,来达到反转链表的目的。初始化:3个指针:1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向null2)cur指针指向待反转链表......
  • java剑指offer:两个链表的第一个公共结点
    java剑指offer:两个链表的第一个公共结点描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解题思路:先假设链表A头结点与结点8的长度与链表B头结点与结点8的长度相等,那么就可以用双指针。......