/**
* 找单链表的中间结点
* ①用两个指针同时从头开始遍历
* ②一个快指针一次走两步,慢指针一次走一步
* ③快指针先到链表尾部,而慢指针则恰好到链表中部
* 快指针到达尾部时,当链表长度为奇数时,慢指针指向的即是链表中间指针;
* 当链表长度为偶数时,慢指针指向的结点和慢指针指向结点的下一个结点都是链表的中间指针
*/
public int SearchMid(){
Node p=this.head;
Node q=this.head;
while(p!=null && p.next!=null&& p.next.next!=null){
p=p.next.next;
q=q.next;
}
return q.data;
}
如何在不知道头结点的情况下删除指定结点
/**
* 如何在不知道头结点的情况下删除指定结点
* 分两种情况来讨论
* ①若待删除的结点为表尾结点,则无法删除。因为删除后,无法使其前驱结点的next指针置空
* ②若待删除的结点不是尾结点,则可以通过交换这个结点与其后继结点的值,然后删除后继结点。
* @param n
* @return
*/
public boolean deleteNode(Node n){
if (n==null || n.next==null) {
return false;
}
int tmp=n.data;
n.data=n.next.data;
n.next.data=tmp;
n.next=n.next.next;
return true;
}