剑指offer:删除链表的节点---在O(1)时间内删除链表节点

/**
 * 题目:(在O(1)时间内删除链表节点)
 *      给定单链表的头指针和节点指针,定义一个函数在O(1)时间内删除节点。
 * 解题思路:
 *       把下一个节点的内容复制到要删除的节点上覆盖原有的内容,再把下一个节点删除。
 *       特殊情况:
 *          1)删除的节点位于链表的尾部,需要从链表的头结点开始,顺序遍历得到该节点的前序节点,并完成删除操作。
 *          2)链表中只有一个节点,又要删除链表的头节点(也是尾节点),那么,在删除节点之后,还要把链表的头节点设置为空
 *     总的平均时间复杂度:[(n-1)*O(1)+O(n)]/n,结果还是O(1),符合要求。
 */
public class P119_DeleteNodeByO1 {
        public void DeleteNodeByO1(ListNode pListNode,ListNode pToBeDeleted){

            //要删除的节点是中间的普通节点
            if (pToBeDeleted.next != null) {
                ListNode temp = pToBeDeleted.next;
                pToBeDeleted.val = temp.val;
                pToBeDeleted.next = temp.next;
            }

            //链表中只有一个节点,删除头节点(也是尾节点)
            else if (pToBeDeleted == pListNode) {
                pListNode = null;
            } else {
                while (pListNode.next != pToBeDeleted) {
                    pListNode = pListNode.next;
                }
                pListNode.next = null;
            }
        }
    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode node1 = new ListNode(2);
        ListNode node2 = new ListNode(3);
        ListNode node3 = new ListNode(4);
        ListNode node4 = new ListNode(5);

        head.next = node1;
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = null;

        P119_DeleteNodeByO1 test = new P119_DeleteNodeByO1();
        test.DeleteNodeByO1(head,node2);
        System.out.print(node1.next.val);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值