不多说了,还是结合代码吧。
package com.dong.istudy.algorithm;
/**
* 1,一个链表是否有环(也就是相交),一個指针走两步,另外一个指针走一半,如何两个重合那么说明相交。
*
* 2,两个链表是否相交 ,
* (两个链表都没有环)分析链表结构,如果相交,那么两个链表的尾节点必为同一个节点,只要分别遍历到两个链表的最后然后比较就可以了。
* (一个链表有环,一个链表没有环),肯定不相交;
* (两个都有环,判断两个链表的的相交点是不是一个节点)
*
* 3,两个链表相交的第一个节点。
*
* 4,链表逆序 5,求链表的倒数第k个节点,一个链表(求链表的中间节点,这个为特例)
*
* 6,合并两个有序链表
*
* 7,链表的倒序输出:
* 思路一,一边遍历链表一边把元素放入到栈中,然后把栈中的元素输出;
* 思路二,对链表进行逆序,然后输出;
* 思路三,利用递归实现,递归的结束条件为node.next 指向的为null
*
* 8,O(1)时间内删除链表当中的一个元素,已知链表的表头和要删除的节点。
*
*/
public class StringAndByte {
public static void main(String[] args) {
}
/**
* 判断链表是否有环,(如果知道链表的长度,那么直接遍历到链表的末尾, 然后判断它的next是否为null,如果为null那么不相交)。
*
* (如果不知道链表的长度,那么就设置两个指针,一个走两步,一个走一步,如果相等,那么相交)
*
* @param head
* @return
*/
private boolean check(LinkNode head) {
LinkNode p1 = head;
LinkNode p2 = head.getNext().getNext();
while (p1 != null && p2 != null) {
if (p1.getData().equals(p2.getData())) {
return true;
} else {
p1 = p1.getNext();
p2 = p2.getNext().getNext();
}
}
return false;
}
}
class LinkNode {
private String data;
private LinkNode next;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public LinkNode getNext() {
return next;
}
public void setNext(LinkNode next) {
this.next = next;
}
}
链表就地逆序问题
/**
*
* @param root 链表的头节点,且链表的头节点存放有数据
* @return
*/
public static ListNode invseList(ListNode root) {
if(root == null || root.nextNode == null) {
return root;
}
ListNode temp = null;
ListNode preNode = root.nextNode;
ListNode afterNode = root.nextNode.nextNode;
while(afterNode != null) {
temp = afterNode.nextNode; //把当前访问的节点的下一个节点作为临时变量保存
afterNode.nextNode = preNode; //反转指针,每次循环只是把当前遍历的节点的下一个节点的指针指向前一个指针
preNode = afterNode; //前一个节点向前移动一步
afterNode = temp; //后一个节点向前移动一步
}
root.nextNode.nextNode = root; //最后只有头节点指向的下一个节点没有逆序
root.nextNode = null;
return preNode;
}