剑指 Offer 18. 删除链表的节点

剑指 Offer 18. 删除链表的节点

难度:简单
题目描述
剑指 Offer 18. 删除链表的节点_第1张图片

解题思路
这道题和剑指offer原题不一样,这道题给的是头节点,再原书里给的就是将要删除的节点
先看这道题,很简单没啥技术含量,为了方便处理边界添加一个虚拟头节点

 /*
			     * 剑指 Offer 18. 删除链表的节点
			     * 2020/7/20
			     */
			    public ListNode deleteNode(ListNode head, int val) {
			    	ListNode temp = new ListNode(-1);
			    	temp.next = head;
			    	ListNode p = temp;
			    	while(p.next != null && p.next.val != val) {
			    		p = p.next;
			    	}
			    	//找到节点,开始删除
			    	p.next = p.next.next;
			    	return temp.next;
			    }

剑指 Offer 18. 删除链表的节点_第2张图片

剑指 Offer 18. 删除链表的节点_第3张图片
如果是像原题这种情况,直接给出了要被删除的节点,并且要求在O(1)时间内完成删除操作,那遍历链表找前驱节点是不满足要求的,直接删除
可以先判断是不是链表尾部的节点,如果是的话直接等于null
如果不是尾部节点的话,
node.val = node.next.val;
node.next = node.next.next;
剑指 Offer 18. 删除链表的节点_第4张图片
先用要被删除节点后面那个位置的节点数据替换要被删除的节点,然后让当前节点指向后一个位置,实际上删除的是给定节点后面那个位置!
自杀不行,就杀别人,然后成为别人
有一道题就是这样的面试题 02.03. 删除中间节点
通过代码:

public void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }

你可能感兴趣的:(力扣刷题笔记)