难度:两星
单链表求中间节点分为两种情况:
1 单链表长度为奇数时,如abcde,那么中间节点就是c。
2 单链表长度为偶数时,如abcdef,那么中间节点有两个c和d。本文简单起见就取第二个中间节点。
思想:其实思想很简单,其实就是跟《判断单链表存储的字符串是否为“回文串”》中求中间节点的方法一模一样,使用快慢指针来求解。
理解了思想,代码就很容易实现了,这里直接贴上来。
package com.coding.studiodemo.linklist;
/**
求单链表的中间节点:
如果长度为奇数,则求出中间节点
abcde--->c
如果长度为偶数,则求出第二个中间节点
abcdef--->d
*/
public class LinkMiddle{
public static LinkNode getLinkMiddle(LinkNode head){
LinkNode slow = head;
LinkNode fast = head;
while(fast.getNext()!=null){
fast = fast.getNext().getNext();
slow = slow.getNext();
}
return slow;
}
public static void main(String[] args) {
LinkNode a = new LinkNode("a");
LinkNode b = new LinkNode("b");
LinkNode c = new LinkNode("c");
LinkNode d = new LinkNode("d");
LinkNode e = new LinkNode("e");
a.setNext(b);
b.setNext(c);
c.setNext(d);
d.setNext(e);
LinkNode mid = getLinkMiddle(a);
System.out.print(mid);
}
}
package com.coding.studiodemo.linklist;
/**
* 定义单链表的节点
* @author jeffSheng
*/
public class LinkNode {
private String val;
private LinkNode next;
public LinkNode(String data){
this.val = data;
}
public String getData() {
return val;
}
public LinkNode getNext() {
return next;
}
public void setNext(LinkNode next) {
this.next = next;
}
@Override
public String toString() {
return "["+val+"]";
}
}
这里不作过多说明,很easy对吧,不明白的可以看下下边的图。
你还有什么办法?欢迎一起留言交流哦~