删除链表的中间节点(每日一道算法题)

题目:删除一个链表的中间节点,当链表只有一个节点的时候或者head节点为空的时候返回head,当链表有两个节点的时候删除第一个节点,当链表有三个节点的时候删除第二个节点,当链表有四个节点的时候删除第二个节点,当链表有五个节点的时候删除第三个节点……

分析:一个链表长度每增加二,要删除的节点就后移一个节点,要删除一个节点需要知道它的前一个节点。

Code:

public static Node removeMidNode(Node head) {
        //如果head为空或者链表只有一个头结点,那么直接返回这个head
        if(head == null||head.next == null) {
            return head;
        }
        //如果链表只有两个节点,那么删除第一个节点,也就是返回第二个节点
        if(head.next.next == null) {
            return head.next;
        }

        Node pre = head;//中间节点的前一个节点从head开始
        Node cur = head.next.next;//从第三个节点开始为当前节点
        while(cur.next != null && cur.next.next != null) {//当节点每后增加两个数,中间节点就后移一个节点
            pre = pre.next;//中间节点的前一个节点
            cur = cur.next.next;//cur表示链表的最后一个节点
        }

        pre.next = pre.next.next;//使得中间节点的前一个节点指向中间节点的后一个节点(删除中间节点)
        return head;//返回这个头节点

    }

参考书籍:《程序员代码面试指南》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值