day3 链表

第一题:移除链表元素

1.C++在清除节点的时候,记得释放内存

2.清除头节点的时候,跟其他的有一点不一样,区别在于直接删去头结点,把第二个节点往上移动一位,或者可以设置一个虚拟头结点,最后返回的时候return dummyNode->next;

3.链表最后一个结点:n->next=NULL;判断一个节点不是最后一个,直接n->next!=NULL

while (cur != NULL && cur->next!= NULL)

 4.直接使用原来的链表进行移除结点操作,不设置虚拟头结点:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 删除头结点
        while (head != NULL && head->val == val) { // 注意这里不是if
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }

        // 删除非头结点
        ListNode* cur = head;
        while (cur != NULL && cur->next!= NULL) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        return head;
    }
};

 其中删除头结点示意图:

day3 链表_第1张图片

删除非头结点示意图:

day3 链表_第2张图片

 5.设置虚拟头结点方法

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
        dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
        ListNode* cur = dummyHead;
        while (cur->next != NULL) {
            if(cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};

设置虚拟头结点删除结点方法:

day3 链表_第3张图片

第二题:设计链表

1.利用虚拟头结点,对表内所有结点进行操作

2.如果涉及下表index,可以用一个cur来控制结点的遍历,

        LinkedList* cur=_xuniHead;

        while(index--)

        {

            cur=cur->next;

        }

3.cur 不需要释放,为删除结点设置的tmp才需要释放

4.释放一个结点(如delete tmp)之后,这个结点的内存并没被完全清除,只是变成了野指针,需要tmp=nullptr规范一下。

第三题:反转链表

1.不是很熟悉,对于结点指针的动态变化需要理解

2.需要一个空指针,作为尾结点的指向

循环示意图

day3 链表_第4张图片

 

你可能感兴趣的:(链表,java,算法)