链表基础知识个人汇总

对于链表,每个节点通常包含至少两个部分:数据部分和指针部分。数据部分存储节点的值,而指针部分存储指向链表中下一个节点的指针。

以下是一些链表的基本操作及其意义:

  1. 创建节点

    ListNode* newNode = new ListNode(value);
    

    创建一个新的节点对象,并将数据部分初始化为value

  2. 设置节点的值

    newNode->val = value;
    

    将节点的数据部分设置为value

  3. 设置节点的指针

    newNode->next = someOtherNode;
    

    将节点的指针部分设置为指向另一个节点someOtherNode

  4. 获取节点的值

    int value = someNode->val;
    

    通过节点的指针访问其数据部分,获取节点的值。

  5. 获取节点的下一个节点

    ListNode* nextNode = someNode->next;
    

    通过节点的指针访问其指针部分,获取指向链表中下一个节点的指针。

  6. 插入节点

    • 头插法:在链表的头部插入一个新节点。
      ListNode* newNode = new ListNode(value);
      newNode->next = head; // 新节点指向原头节点
      head = newNode; // 更新头指针指向新节点
    
    • 尾插法:在链表的尾部插入一个新节点。
      ListNode* newNode = new ListNode(value);
      if (head == NULL) {
          head = newNode; // 如果链表为空,新节点成为头节点
      } else {
          ListNode* current = head;
          while (current->next != NULL) {
              current = current->next;
          }
          current->next = newNode; // 将最后一个节点的指针指向新节点
          newNode->next = NULL; // 新节点的指针设置为NULL
      }
      
  7. 删除节点

    ListNode* current = head;
    while (current != NULL && current->next != NULL) {
        if (current->next->val == value) {
            ListNode* temp = current->next;
            current->next = temp->next; // 跳过要删除的节点
            delete temp; // 释放节点内存
        } else {
            current = current->next;
        }
    }
    

    遍历链表,找到要删除的节点,并将其从链表中移除。

  8. 遍历链表

    ListNode* current = head;
    while (current != NULL) {
        // 处理当前节点
        current = current->next; // 移动到下一个节点
    }
    

    从头节点开始,通过节点的指针逐个访问链表中的每个节点。

  9. 查找节点

    ListNode* current = head;
    while (current != NULL) {
        if (current->val == value) {
            // 找到节点
            break;
        }
        current = current->next;
    }
    

    从头节点开始,遍历链表直到找到值为value的节点。

  10. 反转链表

    ListNode* prev = NULL;
    ListNode* current = head;
    ListNode* next = NULL;
    while (current != NULL) {
        next = current->next; // 保存下一个节点
        current->next = prev; // 反转指针
        prev = current; // 移动prev和current
        current = next;
    }
    head = prev; // 更新头指针
    

    反转链表中的节点的指针方向。

注意
使用 cur->next!=NULL时 必须cur不为空,如果为空,那么没有意义

链表
链表基础
leetcode
删除 https://leetcode.cn/problems/remove-linked-list-elements/description/

   class Solution {
   public:
       ListNode* removeElements(ListNode* head, int val) {
           ListNode* xuni = new ListNode(0);
           xuni->next = head;
           ListNode* cur =xuni;
           while(cur->next !=NULL){
               if(cur->next->val==val){
                   ListNode* pre = cur->next;
                   cur->next=pre->next;
                   delete pre;
               }else{
                   cur=cur->next;
               }
           }
           head = xuni->next;
           delete xuni;
           return head;
           }
};

例1a:链表逆序(206) https://www.programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
例1b:链表逆序2(92)
例2:链表求交点(160)
例3:链表求环(141)
例4:链表划分(86)
例5:复杂链表的复制(138)
例6:2个排序链表归并(21)
例7:K个排序链表归并(23)
剑指offer
例1:从尾到头打印链表(3)
例2:链表中倒数第k个节点(14)
例3:反转链表(15)
例4: 合并两个排序链表(16)
例5: 复杂链表的复制(25)
例6: 两个链表的第一个公共节点(35)
例7: 孩子们的游戏(圆圈中最后剩下的数)(45)
例8:链表中环入口节点(54)
例9:删除链表中重复节点(55)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值