您的位置:首页 > Web前端

《剑指offer》编程题java实现(十八):删除链表的结点

2018-03-11 10:56 337 查看
问题描述

在给定的单向列表的头指针和一个结点指针,定义在一个函数在O(1)时间删除该结点。

思路

一般单向列表删除结点,就是从头遍历,找到这个结点之前的结点,指向这个结点之后的结点,就算是删除了这个结点。这种方法的时间复杂度为O(n)

我们遍历的目的是为了找到这个结点前面的那个结点,所以我们可以采用下面的办法。

将待删除结点的下一个结点的值赋给待删除的结点,然后删除一个结点,就达到了删除结点的目的。

找到合适的算法之后,还有几种情况需要考虑:

1)正常, 多个结点,删除的不是尾结点。

2)只有一个结点,删除尾结点(也是头结点)

3)有多个结点,删除尾结点

代码实现

package com.nowcoder;
/*
* 刪除链表的结点
*/
public class DeleteNode {

//基于一个假设,待删除的结点一定在链表中
public  void delete(ListNode head, ListNode toBeDelete){
//1.输入的头结点或者待删除节点为空
if (head==null||toBeDelete==null) {
return;
}
//2.输入的链表只有一个结点,则删除头结点,使该链表为空
if (head.next==null) {
head=null;
return;
}
//3.待删除的结点为最后一个结点
if (toBeDelete.next==null) {
ListNode node=head;
while(node.next!=toBeDelete) {//遍历找到倒数第二个结点
node=node.next;
}
node.next=null;//将倒数第二个结点的下一个节点设为空,即删除了最后一个结点
}else {//4.正常情况,待删除节点复制其下一个节点的值,并将下一个节点跳过即可
toBeDelete.val=toBeDelete.next.val;
toBeDelete.next=toBeDelete.next.next;
}

}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐