Linked list - learning notes

catalogue

Knowledge points:

Code template summary:

Question:

reference:

Knowledge points:

Linked list: a linear structure in which pointers are connected in series. Each node contains a pointer field and a data field.

Type: single linked list (each node points to the next node), double linked list (each node refers to the forward node and rear node), circular linked list (the linked list is connected end to end).

Delete and add: the time complexity is O(1), but the time complexity of finding is O(n). As opposed to arrays.

Code template summary:

1. Definition and calling method of linked list:

//definition
struct ListNode {
    int val; // Elements stored by nodes
    ListNode *next; // Pointer to the next node
    ListNode(int x) : val (x), next(NULL) {} // Constructor of node
};

//Construct initialization node
ListNode* head = new ListNode(5);

1. Virtual node definition

When it comes to the deletion of the linked list, we can set a virtual node to point to the head node of the linked list, so that we can perform the same deletion operation for the whole linked list instead of dealing with the head node separately.

 //Set the virtual node, which refers to the head node
   ListNode* dummyHead = new ListNode(0);
   dummyHead->next = head;
 //Query the entire linked list
   ListNode* cur = dummyHead;
   while (cur->next != NULL) {
  }
//Delete virtual node
   head = dummyHead->next;
   delete dummyHead;
   return head;

2. Switching node

Some nodes need to be reserved and some nodes need to be changed,

Save is temp (temporary) = cur (current); Change nodes with cur = temp.

/*When saving nodes, temp... = cur*/
   ListNode* temp = cur->next;
   ListNode* temp1 = cur->next->next;
   ListNode* temp2 = cur->next->next->next;
/*When changing nodes, cur... = temp*/
   cur->next = temp1;
   cur->next->next = temp;
   cur->next->next->next = temp2;

3. Find node operation

//Find the length of linked list A
    int lenA = 0;
    while(curA != NULL) {
        lenA++;
        curA = curA->next;
    }
//Find the node at index
    LinkedNode* cur = dummyNode->next;
    while(index--) {
        cur = cur->next;
    }
//Traverse the current linked list (nodes may be added at the end)
    LinkedNode* cur = dummyNode;
    while(cur->next!=NULL) {
        cur = cur->next;
    }
    cur->next = newNode;

Question:

203. Remove the linked list element LeetCode (LeetCode CN. Com)

Note: 1. Remember to release memory during c + + delete node operation.

2. Set up a virtual node to remove the head node and other nodes in the same way.

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //Set virtual node
        ListNode* dummyHead = new ListNode(0);
        //Virtual node refers to the head node
        dummyHead->next = head;
        //Query the entire linked list
        ListNode* cur = dummyHead;
        while (cur->next != NULL) {
            //If it's that value
            if (cur->next->val == val) {
                ListNode* temp = cur->next;
                cur->next = cur->next->next;
                delete temp;
            } else {
                cur = cur->next;
            }
        }
        //Delete virtual node
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};

 707. Design linked list - LeetCode (LeetCode CN. Com)

class MyLinkedList {
public:
    //Define the linked list structure. The structure is a large hump, and there is a semicolon at the end of the structure
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int x):val(x), next(NULL){}
    };
    //Initialize linked list
    MyLinkedList() {
        //Define a virtual node, not a real head node
        dummyNode = new LinkedNode(0);
        size = 0;
    }
    //Get the value of the index node in the linked list
    int get(int index) {
        //Judge whether the limit is exceeded
        if(index > size - 1 || index < 0) {
            return -1;
        }
        LinkedNode* cur = dummyNode->next;
        //Query list
        while(index--) {
            cur = cur->next;
        }
        return cur->val;
    }
    // Insert a node at the front of the linked list. After the insertion, the newly inserted node is the new head node of the linked list
    void addAtHead(int val) {
        //Define a new node
        LinkedNode* newNode = new LinkedNode(val);
        //Point to the head node behind the virtual node
        newNode->next = dummyNode->next;
        //The virtual node points to this node
        dummyNode->next = newNode;
        //Length++
        size++;
    }
    // Add a node at the end of the linked list
    void addAtTail(int val) {
        //Define a new node
        LinkedNode* newNode = new LinkedNode(val);
        //Query the current linked list
        LinkedNode* cur = dummyNode;
        while(cur->next!=NULL) {
            cur = cur->next;
        }
        cur->next = newNode;
        //Length + + (remember)
        size++;
    }
    /*Add a node with a value of # val # before the # index # node in the linked list.
    If "index" is equal to the length of the linked list, the node will be attached to the end of the linked list.
    If the index is greater than the length of the linked list, the node will not be inserted.
    If the index is less than 0, the node is inserted in the header.*/
    void addAtIndex(int index, int val) {
        if(index > size) { return;}
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* cur = dummyNode;
        while(index--) {
            cur = cur->next;
        }
        newNode->next = cur->next;
        cur->next = newNode;
        size++;
    }
    //If the index is valid, delete the index node in the linked list.
    void deleteAtIndex(int index) {
        //Judge whether it is valid. It can be equal to the current length
        if(index >= size || index < 0) return;
        //Define virtual nodes
        //LinkedNode* dummyNode = newNode* dummyNode;
        //Current node (first error)
        LinkedNode* cur = dummyNode;
        //lookup
        while (index--) {
            cur = cur->next;
        }
        //Find the node
        LinkedNode* temp = cur->next;
        cur->next = temp->next; 
        //Release and subtract one
        delete temp;
        size--;
    }
    //Print linked list
    void printLinkList() {
        //Define node
        LinkedNode * cur = dummyNode;
        //lookup
        while (cur->next != NULL) {
            cout << cur->next->val <<" ";
            cur = cur->next;
        }
        cout <<endl;
    }
//Note that private members are also defined
private:
    int size;
    LinkedNode* dummyNode;
};

Many foundations in the linked list are more important.

24. Exchange the nodes in the linked list - LeetCode (LeetCode CN. Com)

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyNode = new ListNode(0);
        dummyNode->next = head;
        ListNode* cur = dummyNode;
        while(cur->next != nullptr && cur->next->next != nullptr) {
            /*When saving nodes, temp... = cur*/
            // Save temporary nodes 1, 2 and 3
            ListNode* temp = cur->next;
            ListNode* temp1 = cur->next->next;
            ListNode* temp2 = cur->next->next->next;
            /*When changing nodes, cur... = temp*/
            //Step 1
            cur->next = temp1;
            //Step 2
            cur->next->next = temp;
            //Step 3
            cur->next->next->next = temp2;
            //Move back two places
            cur = cur->next->next;
        }
        return dummyNode->next;
    }
};

This involves the exchange between many nodes and needs to be saved,

Save is temp (temporary) = cur (current); Change nodes with cur = temp. There will be no mistakes.  

19. Delete LeetCode (leetcode-cn.com), the penultimate node in the linked list

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyNode = new ListNode(0);
        dummyNode->next = head;
        ListNode* cur = dummyNode;
        ListNode* temp = dummyNode;
        int size = 0; 
        //Come on, the pointer has come to an end
        while(cur->next != 0) {
            size++;
            //The slow pointer takes n steps less than the fast pointer
            if(size > n) {
                temp = temp->next;
            }
            cur = cur->next;
        }
        ListNode* temp2;
        temp2 = temp->next;
        temp->next = temp->next->next;
        delete temp2;
        return dummyNode->next;
    }
};

Error: don't return head when returning the head node. If there is no chain header node, use the virtual node.  

Interview question 02.07 Linked list intersection force buckle (LeetCode) (LeetCode CN. Com)

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0, lenB = 0, dif = 0;
        //Find the length of linked list A
        while(curA != NULL) {
            lenA++;
            curA = curA->next;
        }
        //Find the length of linked list B
        while(curB != NULL) {
            lenB++;
            curB = curB->next;
        }
        curA = headA;
        curB = headB;
        //Find the length difference, assuming that the largest is A
        if(lenA < lenB) {
            swap(lenA, lenB);
            swap(curA, curB);
        }
        dif = lenA - lenB;
        //The tail position is opposite to it, that is, the length difference of the long linked list moving forward
        while(dif--) {
            curA = curA->next;
        }
        //Traversal array
        while(curA != NULL) {
            if(curA == curB)
            return curA;
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};

Error: 1. When judging the node length, using cur - > next will cause the array to be exceeded.

2. This problem is that two nodes are equal, that is, the pointer is the same, not the value is the same.

142. Ring linked list II - LeetCode (LeetCode CN. Com)

Judge whether there is a ring: define the speed pointer. fast takes two nodes and slow takes one node. If there is a ring, it will meet in the ring.

Meeting place: start a pointer from the beginning node and start a pointer from the meeting node. The two pointers only go to one node at a time. Then when the two pointers meet, they are the nodes of the ring entrance.

ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != NULL && fast->next != NULL) {
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow) {
                ListNode* meet = fast;
                ListNode* start = head;
                while(meet != start) {
                    meet = meet->next;
                    start = start->next;
                }
                return meet;
            }
        }
        return NULL;
    }

reference:

Code Capriccio (programmercarl.com)

Keywords: data structure linked list

Added by henryblake1979 on Sat, 05 Mar 2022 14:24:20 +0200