略
题目:给定单向链表的头指针和一个结点指针,定义一个函数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 | public class Solution { |
总结
- 年三十还在写,先给自己点个赞。
- 写程序要有创新精神,例如本题的删除结点的方法一和方法二。
- 全面思考:如果结点为空或者它的下一个结点为空的情况。