IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 链表的删除&&常见的问题 -> 正文阅读

[数据结构与算法]链表的删除&&常见的问题

一. 链表有无头结点的区别(单链表)


首先
? 我们需要了解,删除节点p, 我们只需要找到 p的上一个结点pre的位置, 进行 pre.next = p.next 即可。


?头结点: 指针域指向首元结点(具有实际意义的第一个元素结点) ,数据域可以不存任何信息,指针域指向单链表第一个元素的结点。头结点可有可无,但为了操作方便,一般情况下单链表都具有头结点
优点:
?为了减少程序的复杂性(添加和删除操作,在首元结点上有区别与其他的操作 ), 如果链表没有头结点,则删除或添加时都得需要判断一次首元结点,有了头结点以后,首元结点实际为链表的第二个结点,可以使得在添加删除的操作上更具有统一性
缺点: 会多出一个不必要的空间


1 Example1 有头结点

// 题目大意:删除,值为val的结点(单次删除), 并返回头结点
public ListNode removeElement(ListNode head, int val) {
        if(head.next==null) return head;//空链表
        ListNode pre = head, p = head.next;
        while(p.val!=val&&p.next!=null) {
                pre = p;
                p = p.next;
        }
        if(p.val==val) {
            pre.next = p.next;
        }else {
        	//此链表无,值为val的结点
        }
        return head;
    }
}

1 Example2 无头结点

// solution 1 使用上面 "Example1 无头结点"的解法,最后再处理head ---> Acceted / Used
public ListNode removeElements(ListNode head, int val) {
        if(head==null) return head;//空链表
        ListNode pre = head, p = head.next;
        if(p!=null) {
            while(p.val!=val&&p.next!=null) {
                pre = p;
                p = p.next;
            }
            if(p.val==val) {
                pre.next = p.next;
                return head;
            }else {
            	//此链表无,值为val的结点
            }
        }
        if(head.val==val) head = head.next;//最后判断头结点
        return head;
    }
}
//solution 2 
public ListNode removeElements(ListNode head, int val) {
        if(head==null) return head;//空链表
        ListNode p = head, pre;
        while(p.val!=val&&p.next!=null) {
            pre = p;
            p = p.next;
        }
        if(p.val==val) {
        	if(p==head) {// 多次此处的条件,相比于 "Example1 无头结点"
        		return head = p.next;
        	}else {
            	pre.next = p.next;
        	}
        }else {
        	//此链表无,值为val的结点
        }
        return head;
    }
}

1 Example3 无头结点(删除链表中所有值为val的结点)

//Solution 1 迭代 ---> 根据上面"Example2 无头结点 solution 1" 拓展使用 --->Acceted / Used
// 耗时 O(n),空间O(1)
public ListNode removeElements(ListNode head, int val) {
        if(head==null) return head;//空链表
        ListNode pre = head, p = head.next;
        while(p!=null) {
            while(p.val!=val&&p.next!=null) {
                pre = p;
                p = p.next;
            }
            if(p.val==val) {
                pre.next = p.next;
            }else {
            	//此链表无,值为val的结点
            }
            p = p.next;
        }
        if(head.val==val) head = head.next;//最后判断头结点
        return head;
    }
}

//Solution 2 递归 --->Acceted 时空都是O(n),
// 
public ListNode removeElements(ListNode head, int val) {
	if(head==null) {
		return head;
	}
	head.next = removeElements(head.next,val);//当前结点只需要考虑下一个节点即可,递归即可
	return head.val==val?head.next:head;//从后面开始判断,返回head/head.next 即可
}

//Solution 3 官方:构造有头结点的链表 ---> (Acceted / Used) Optimally 
//题解链接https://leetcode.cn/problems/remove-linked-list-elements/solution/yi-chu-lian-biao-yuan-su-by-leetcode-sol-654m/
// 耗时 O(n),空间O(1)
public ListNode removeElements(ListNode head, int val) {
	ListNode pre = new ListNode(0);
	pre.next = head;
	ListNode temp = pre;
	while(temp.next!=null) {
		if(temp.next.val==val) {
			temp.next = temp.next.next;//指针指向
		}else {
			temp = temp.next;//指针指向
		}
	}
	return pre.next;
}

//(含头结点)单链表的节点删除,增加—最易犯错!!!
https://blog.csdn.net/weixin_46273997/article/details/106087607

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:09:52  更:2022-07-20 19:12:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:15:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码