删除链表中指定的节点

package com.again.common.arithmetic.LinkedList;

import com.again.common.arithmetic.Node;
import com.google.common.base.Preconditions;

/**
 * 单向链表
 *
 *  删除链表中指定的节点
 *
 */
public class SinglyLinkedList {

    /**
     * 删除链表中指定的节点
     *
     *  说明:首先将targetNode的后继节点的值复制到targetNode中,然后将targetNode的后继节点删除掉,最终的效果与删除targetNode等价,但是时间复杂度为O(1)。
     *
     *  注意:
     *      1)前提是targetNode一定存在于链表中。
     *      2)若要删除的节点是尾节点,则我们只能通过遍历链表来删除尾节点,时间复杂度为O(n)。
     *      3)所以平均时间复杂度为[(n-1)*O(1) + O(n)]/n ,即平均时间复杂度仍然为O(1)。
     *
     * @param head  头节点
     * @param targetNode    要删除的节点
     */
    public static void deleteNode(Node head, Node targetNode) {

        Preconditions.checkArgument(null != head && null != targetNode);

        // 要删除的节点是尾节点
        if (null == targetNode.next) {

            Node currentNode = head;

            if (currentNode == targetNode) { // 链表中只有一个节点,删除该节点时应该同时将指向它的引用都置为null。
                targetNode = null;
                head = null;
                currentNode = null;

            } else {                        // 链表中节点数大于1

                while (currentNode!= null && currentNode.next != targetNode) {
                    currentNode = currentNode.next;
                }

                if (null != currentNode) {
                    currentNode.next = currentNode.next.next;
                    targetNode.next = null;
                } else { // 要删除的节点在链表中不存在
                }
            }

        }

        // 要删除的节点不是尾节点
        else {

            // targetNode的后继节点
            Node nextOfTargetNode = targetNode.next;

            // 将targetNode的后继节点的值复制到targetNode中,
            // 此时targetNode的值和它的后继节点的值相等,故删除掉targetNode的后继节点等价于删除targetNode
            targetNode.value = nextOfTargetNode.value;

            // 删除targetNode的后继节点
            targetNode.next = nextOfTargetNode.next;
            nextOfTargetNode.next = null;
        }
    }

    public static void main(String[] args) {

        Node head = LinkedListUtil.init();
        Node node3 = head.next.next.next;
        LinkedListUtil.print(head);
        deleteNode(head,node3);
        LinkedListUtil.print(head);
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值