剑指offer——删除链表的节点

题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

数据范围:

0 <=链表节点值 <= 10000

0 <=链表长度 <= 10000

示例1:

输入:{2,5,1,9},5

返回值:{2,1,9}

说明:

给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为2 -> 1 -> 9

示例2:

输入:{2,5,1,9},1

返回值:{2,5,9}

说明:

给定链表中值为1的第三个节点,那么在调用了你的函数之后,该链表应变为2 -> 5 -> 9 

思路及解答:

 如果我们要删除链表里面的一个节点,其实就是将前置节点的next直接指向当前节点的后置节点,这样在链表中再也找不到该节点了,也就是相当于删除了。

假设有一个链表,我们需要删除里面的5:

剑指offer——删除链表的节点_第1张图片

首先需要判断链表头结点是不是为空,如果为空,那么就直接返回null,如果等于我们要找的,那么直接返回下一个节点引用即可。如果不符合以上说的,我们则需要新建一个前置节点pre,与现在的链表连接在一起:

 剑指offer——删除链表的节点_第2张图片

然后初始化一个cur节点表示当前节点,指向head节点:

 剑指offer——删除链表的节点_第3张图片

cur不为空,cur和pre后移:

 剑指offer——删除链表的节点_第4张图片

发现cur正是我们需要查找的5,那么记录下5的下一个节点1,也就是next:

 剑指offer——删除链表的节点_第5张图片

 cur的next指向null,使用pre的next指向刚刚记录的next:

剑指offer——删除链表的节点_第6张图片

简化链表也就是:

 剑指offer——删除链表的节点_第7张图片

取之前虚拟的头结点的后一个节点,就是删除掉之后的新链表:

 剑指offer——删除链表的节点_第8张图片

Java实现代码如下所示:

class ListNode{
    int val;
    ListNode next = null;

    public ListNode(int val){
        this.val = val;
    }
}

public class Solution{
    public ListNode deleteNode(ListNode head,int val){
        if(head == null){
            return null;
        }
        if(head.val == val){
            return head.next;
        }
        //用一个节点将头节点链接起来
        ListNode pre = new ListNode(-1);
        pre.next = head;

        ListNode cur = head;
        ListNode next = null;
        while(cur != null){
            cur = cur.val;
            pre = pre.next;
            //如果相等,则指针指向下一个节点
            if(cur.val == val){
                next = cur.next;
                break;
            }
        }
        cur.next = null;
        //将前置节点直接连接后一个节点,相当于删除掉了该节点
        pre.next = next;
        return head;
    }    
}

 

你可能感兴趣的:(剑指offer刷题,链表,算法,数据结构,leetcode,intellij-idea,开发语言,java)