在O1时间删除链表节点
问题描述:给定单向链表的头指针和一个节点指针, 定义一个函数在O(1)时间删除该节点。
首先本题只是说删除节点的操作是O1的,实际上查找是需要On的,这个要注意一下。
本方法思想:给定当前节点的话 我们是不知道上一个节点的,所以普通方法必须遍历才能找到上一个节点,所以可以这样做:将要要删除的节点的下一个节点的值赋给要删除的节点,删除下一个节点即可,注意判断边界条件,具体注释见代码。
持续更新...
代码附下
Java实现:
package 在O1时间删除链表节点;
/**
* 给定单向链表的头指针和一个节点指针, 定义一个函数在O(1)时间删除该节点
*
* @author user 给定当前节点的话 我们是不知道上一个节点的 所以普通方法必须遍历才能找到上一个节点,所以可以这样做:
* 将要要删除的节点的下一个节点的值赋给要删除的节点 删除下一个节点即可 注意判断边界条件
*/
class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
public class Test {
public static void main(String[] args) {
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(3);
ListNode n4 = new ListNode(4);
n1.next = n2;
n2.next = n3;
n3.next = n4;
Test test = new Test();
ListNode head = n1;
test.delNode(head, n1);
while (head != null) {
System.out.println(head.val);
head = head.next;
}
}
public void delNode(ListNode head, ListNode delNode) {
if (head == null || delNode == null) {
return;
}
if (head == delNode) {// 头节点就是要删除的节点,直接将头结点置空
head = null;
} else if (delNode.next == null) {// 如果要删除的是尾节点,需要遍历找到上一个节点
ListNode node = head;
while (node.next.next != null) {// 找到尾节点的上一个节点
node = node.next;
}
node.next = null;// 将上一个节点的下一个节点置空,成为新的尾节点
} else {// 常规情况下(既不是尾节点,也不是头节点)
delNode.val = delNode.next.val;// 将要删除节点的下一个节点的内容拷贝
delNode.next = delNode.next.next;// 删除下一个节点即可
}
}
}
持续更新...欢迎赞赏!
https://blog.csdn.net/ustcer_93lk/article/details/80372693
如果有问题,欢迎大家留言,有更好的方法也期待大家告知。