《剑指offer》编程题java实现(十八):删除链表的结点
2018-03-11 10:56
337 查看
问题描述
在给定的单向列表的头指针和一个结点指针,定义在一个函数在O(1)时间删除该结点。
思路
一般单向列表删除结点,就是从头遍历,找到这个结点之前的结点,指向这个结点之后的结点,就算是删除了这个结点。这种方法的时间复杂度为O(n)
我们遍历的目的是为了找到这个结点前面的那个结点,所以我们可以采用下面的办法。
将待删除结点的下一个结点的值赋给待删除的结点,然后删除一个结点,就达到了删除结点的目的。
找到合适的算法之后,还有几种情况需要考虑:
1)正常, 多个结点,删除的不是尾结点。
2)只有一个结点,删除尾结点(也是头结点)
3)有多个结点,删除尾结点
代码实现
在给定的单向列表的头指针和一个结点指针,定义在一个函数在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; } } }
相关文章推荐
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点
- 《剑指offer》编程题java实现(十九):链表中环的入口结点
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
- 剑指offer--面试题13:在O(1)时间删除链表结点--Java实现
- 删除链表中重复的结点java实现
- 数据结构与算法分析笔记与总结(java实现)--链表14:删除链表中所有指定值结点问题
- 剑指offer--面试题13:在O(1)时间删除链表结点--Java实现
- (php实现剑指offer)删除链表中重复的结点
- 【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】
- 数据结构与算法分析笔记与总结(java实现)--链表8:对排序链表删除重复结点问题
- Java链表实现删除重复结点以及合并链表(非递减)
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- 《剑指offer》编程题java实现(三):从尾到头打印链表
- 《剑指offer》编程题java实现(五):链表中倒数第k个字节
- 《剑指offer》编程题java实现(二十二):两个链表的第一个公共节点
- 《剑指offer》编程题java实现(十七):合并两个排序的链表
- 链表:删除链表中重复的结点(java实现)
- 数据结构与算法分析笔记与总结(java实现)--链表10:输入某个结点删除单向链表中的该结点
- 《剑指offer》编程题java实现(十三):反转链表
- 《剑指offer》面试题57 删除链表中重复的结点 C++ 实现 以及 错误总结 (指针问题)!!