剑指 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;
}
}
如有错误,欢迎指正!