链表算法:
1.给定一个链表,但是不知道链表大小,要求遍历一次,找到链表的中间位置

方法:快慢指针法
定义两个指针都指向head节点,fast指针每次移动两步,slow指针每次移动一步,当fast不能再往后走时,slow此时指向的是中间值

代码:
//找到链表的中间值
public Node findMid() {
//定义快指针fast
Node fast = head;
//定义慢指针slow
Node slow = head;
while ((fast != null)&&(fast.next!=null)) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
2.判断一个链表是否有环

方法:Floyd环判定算法
定义快慢两个指针,一直执行移动下去,如果两个指针在某点重合说明有环
代码:
//查询链表是否成环
public boolean HashCycle() {
//定义快指针fast
Node fast = head;
//定义慢指针slow
Node slow = head;
while ((fast != null)&&(fast.next!=null)) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
return true;
}
}
return false;
}
3、判断一个链表是否有环,并找到成环的起始位置

方法:让一个指针指向链表起点,另一个指针留在第一次相遇的结点处,两个指针每次都只走一步,当再次相遇时。就是成环位置
代码:
//找到成环的位置
public void HashCycle1() {
//定义快指针fast
Node fast = head;
//定义慢指针slow
Node slow = head;
while ((fast != null)&&(fast.next!=null)) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
slow = head;
while (slow !=fast) {
fast = fast.next;
slow = slow.next;
}
System.out.println(slow.val);
return;
}
}
}
4.在原链表上翻转

方法:两个指针:一个指向当前head节点的前一个位置,一个指向head节点的后一个位置
代码:
//链表的翻转
public void fanzhuan() {
Node pre = null;
Node next = null;
while (head!=null) {
next = head.next;
head.next = pre;
head = next;
}
head = pre;
}
5.截取出单链表的后k个结点
方法:一开始fast和slow就相隔k个结点然后逐次移动,当fast指向null时,slow指向的就是后k个节点的开始位置

代码:
//截取后k个结点,此处设k为2
public void NthFromEnd(int k) {
Node fast = head;
//定义快指针fast
while (--k>0) {
fast = fast.next;
}
//定义慢指针slow
Node slow = head;
while ((fast != null)&&(fast.next!=null)) {
fast = fast.next;
slow = slow.next;
}
head = slow;
return;
}
本文深入探讨了Java链表算法,包括使用快慢指针找到链表中间节点,Floyd环判定算法判断链表是否有环,找到环的起始位置,链表原地翻转的方法,以及如何截取链表的后k个节点。通过实例代码展示了这些常见链表操作的实现过程。
1339

被折叠的 条评论
为什么被折叠?



