题目:删除一个链表的中间节点,当链表只有一个节点的时候或者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;//返回这个头节点
}
参考书籍:《程序员代码面试指南》