其他分享
首页 > 其他分享> > 203. 移除链表元素

203. 移除链表元素

作者:互联网

203. 移除链表元素

给你一个链表的头节点 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
输出:[]

提示:

列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50

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) {}
 * };
 * 时间复杂度: O(n)
 * 空间复杂度: O(1)
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 删除头结点
        while ( head != NULL && head->val == val) {
            ListNode* temp = head;
            head = head->next;
            delete temp;
        }

        // 删除非头结点
       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;
    }
};

java:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 * 时间复杂度:O(n)
 * 空间复杂度:O(1)
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        // 看头结点是不是满足条件
        while (head != null && head.val == val){
            head = head.next;
        }
        // 看头结点是不是为空
        if(head == null){
            return head;
        }
        // 确定头结点不为空
        ListNode pre = head;
        ListNode cur = head.next;
        while (cur != null){
            if(cur.val == val){
                pre.next = cur.next;
            } else {
                pre = cur;
            }
            cur = cur.next;
        }
        return head;
    }
}

问题:

  1. 几种语言之间关于内存的管理机制,以及清空相应内存的关键字 : delete free 等

  2. 头节点与首元节点

    • 头节点:

      有时,在链表的第一个节点之前会额外增设一个节点,该节点的数据域一般不存放数据(有些情况下也可以存放链表的长度等信息),此节点被称为头节点。

      若链表中存在头节点,且头节点的指针域为空(NULL),表明链表是空表。

      头节点对于链表来说,不是必须的,换句话说,一个完整的链表中可以不设有头节点。那么,可能有人会问:既然头节点无关紧要,那它有什么作用?在处理某些问题时,给链表添加头节点会使问题变得简单

    • 首元节点:

      链表中第一个元素所在的节点,它是头节点后边的第一个节点。

      其实,首元节点和链表中存放数据的其他节点没什么不同,只是因为该节点位于链表的头部,所以被称为首元节点。

  3. 几种语言之间的特殊字符怎么填写 比如:true false 啥时候大写,啥时候小写,啥时候只有首字母大写

标签:203,ListNode,cur,val,head,next,链表,移除,节点
来源: https://www.cnblogs.com/luketebo/p/16476339.html