在O(1)时间删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数O(1)时间删除该结点。链表结点与函数的定义如下:

1
2
3
4
5
6
7
8
public class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}

分析

  对于一个单向链表,它的特点是它如果要找一个结点,就只能从链表头部开始遍历链表一直到找到那个结点,而不能由后向前开始遍历。所以已知中间某个结点,需要知道它前面的一个结点无法倒着查找,而只能从头开始查找那个结点。

  对于本题,删除结点有两种方法:一是查找到需要删除的结点的前驱,把前驱的指针指向需要删除的结点的后继结点。二是把需要删除的结点的后继结点复制给需要删除的结点。非常明显第二种方法比第一种方法更加的简单方便,因为不用找前驱结点,也就不用从头开始遍历链表了。

代码实现

代码如下:

1
2
3
4
5
6
7
8
9
10
public class Solution {
public void deleteNode(ListNode node) {
if (node == null || node.next == null)
return;
ListNode next = node.next;
node.val = next.val;
node.next = next.next;
return;
}
}

总结

  1. 年三十还在写,先给自己点个赞。
  2. 写程序要有创新精神,例如本题的删除结点的方法一和方法二。
  3. 全面思考:如果结点为空或者它的下一个结点为空的情况。