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

来源:互联网 发布:2016流行的编程语言 编辑:程序博客网 时间:2024/06/02 01:18

题目:删除一个链表的中间节点,当链表只有一个节点的时候或者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;//返回这个头节点    }

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

原创粉丝点击