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

原题链接

题解

单指针扫描

直接从前向后遍历,找到要删除元素的上一个元素,然后直接进行操作就可以了。在我们操作无头结点链表的时候有一个技巧:如果我们的头节点可能变化的情况下,我们可以给它加上一个头结点,这样就可以省去许多的判定,操作更加的方便。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        ListNode dummy = new ListNode();
        dummy.next = head;
        head = dummy;
        while(head.next != null){
            if(head.next.val == val) break;
            head = head.next;
        }

        if(head.next != null) head.next = head.next.next; 

        return dummy.next; 
    }
}

递归法

使用递归遍历链表的时候,当遇到了要删除的元素,直接将要删除元素的下一个值返回,然后回溯赋值即可。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        if(head == null) return null;
        if(head.val == val) return head.next;
        head.next = deleteNode(head.next, val);
        return head;
    }
}
如有错误,欢迎指正!
原文地址:https://www.cnblogs.com/Lngstart/p/14734620.html