移除链表元素

题:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:
输入:head = [], val = 1
输出:[]

示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]

思路

  1. 直接使用原来的链表来进行删除操作。
    在单链表中移除头结点和移除其他节点的操作方式是不一样,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。其余节点只要使指针指向下一节点就行了。注意C++编程要手动在内存中清除已经删除的节点,其余语言不需要
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
//直接删除节点
         //删除头节点
         while (head != NULL && head->val == 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;
         }

所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。
2. 设置一个虚拟头结点在进行删除操作。
可以设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了。最后,return 头结点的时候,不要忘了 return dummyNode->next;, 这才是新的头结点

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
//设置虚拟头节点
    ListNode* dummyhead = new ListNode(0);
    dummyhead->next = 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;
    }
};
posted @ 2021-11-02 09:43  Ada_CN  阅读(42)  评论(0编辑  收藏  举报