算法之链表-插入删除查询等基本操作

78 阅读2分钟

1.删除值

输入: 链表head,需要删除的值val
方法: 分两种情况

  1. 删除的为头节点:让头节点指向下一个元素 删除头节点
  2. 非头节点:如果找到删除值,创建一个新指针指向当前删除元素\

输出: 删除后的链表head
leetcode: leetcode.cn/problems/re…

class Solution {
public:
// 删除元素值为val的结点 返回当前链表head
    ListNode* removeElements(ListNode* head, int val) {
        // 头节点 ---让头节点指向下一个元素 删除头节点
        while (head != NULL && head->val == val) {
            ListNode* p = head;
            head = head->next;
            delete p;
        }
        // 非头节点--- 如果找到删除值,创建一个新指针指向当前删除元素
        // 指针后移,删除当前元素
        ListNode* p = head;
        while (p != NULL && p->next != NULL) {
            if (p->next->val == val) {
                // lnode=>next是要删除元素
                ListNode* temp = p->next;
                p->next = p->next->next;
                delete temp;
            } else {
                p = p->next;
            }
        }

        return head;
    }
};

2.链表设计

leetcode: leetcode.cn/problems/de…

  1. 报了一个错 有链表空指针
    Line 20: Char 19: runtime error: member access within null pointer of type 'ListNode' (solution.cpp) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior solution.cpp:20:19
  2. 写法和之前typedef不同
  3. linkNode改名linkedList就会报错
  4. 采用private 定义了size

image.png



    class MyLinkedList {
    public:
        MyLinkedList() {
            this->size = 0;
            this->head = new ListNode(0);
        }
        int get(int index) {

            // 无效范围
            if (index < 0 || index > size) {
                return -1;
            }

            // 初始指向头节点

            ListNode* p = head;

            // 遍历到index

            for (int i = 0; i <= index; i++) {

                p = p->next;

            }
            // 获取值
            return p->val;

        }

        // 在链表的最前面插入一个节点

        void addAtHead(int val) { addAtIndex(0, val); }

        // 在链表的最后面插入一个节点

        void addAtTail(int val) { addAtIndex(size, val); }



        // 插入元素------在链表第index个节点前面插入一个节点

        void addAtIndex(int index, int val) {
            if (index < 0 || index >size) {
                return ;
            }

              index = max(0, index);
              size++;

            // 初始指向头节点

            ListNode *p = head;

            // 遍历到index

            for (int i = 0; i <index; i++) {
                p = p->next;

            }

            //-------这些和上面获取值一样-------

            // 插入元素

            ListNode *q=new ListNode(val);

            q->next=p->next;

            p->next=q;

        }

        // 删除链表的第index个节点
        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;

    };