【单链表】快慢指针原理-Java语言

1.结点类

package blog;

/**
 * @Description: 结点类
 * @author: liuqiang
 * @Date: 2018/12/28 23:33
 */
public class Node {
    public String data; // 结点的数据域
    public Node next; // 结点的指针域

    public Node() {
    }

    // 构造方法时给data赋值
    public Node(String data) {
        this.data = data;
    }
    
}

2.单链表类

package bolg;

/**
 * @Description: 单链表类
 * @author: liuqiang
 * @Date: 2018/12/28 23:38
 */
public class LinkList {
    private Node head; // 头结点
    
    // 调用LinkList构造方法时初始化head
    public LinkList() {
        head = new Node();
    }

    /**
     * @Description: 尾插法插入结点
     * @param: [node]
     * @return: void
     * @author: liuqiang
     * @updateTime: 2018/12/28 23:53
     */
    public void addNode(Node node) {

        Node temp = head; // 把头结点看做一个指向结点的指针
        while (temp.next != null) { // 遍历单链表,直到遍历最后的元素则跳出
            temp = temp.next; // 指针指向下一个结点
        }
        temp.next = node; // 将node指向最后一个结点
    }

    /**
     * @Description: 计算链表的长度
     * @param: []
     * @return: int
     * @author: liuqiang
     * @updateTime: 2018/12/28 23:58
     */
    public int length() {
        int length = 0;
        Node temp = head;
        while (temp.next != null) {
            length++;
            temp = temp.next;
        }
        return length;
    }

    /**
     * @Description: 在指定位置插入结点
     * @param: [index, node]
     * @return: void
     * @author: liuqiang
     * @updateTime: 2018/12/30 14:29
     */
    public void insert(int index, Node node) {
        if (index < 1 || index > length() + 1) {
            System.out.println("插入位置不合法");
            return;
        }
        int length = 1; // 记录遍历到的位置
        Node temp = head; // 可移动的指针
        while (head.next != null) {   // 遍历单链表
            if (index == length) {
                node.next = temp.next;
                temp.next = node;
                return;
            }
            temp = temp.next;
        }
    }

    /**
     * @Description: 根据位序数删除结点
     * @param: [index]
     * @return: void
     * @author: liuqiang
     * @updateTime: 2018/12/30 14:44
     */
    public void delete(int index) {
        // 判断index是否合理
        if (index < 0 || index > length()) {
            System.out.println("删除位置不合理");
            return;
        }
        int length = 1;
        Node temp = head;
        while (temp.next != null) {
            if (index == length) {
                temp.next = temp.next.next;
                return;
            }
            temp = temp.next;
            length++;
        }
    }

    /**
     * @Description: 打印单链表的数据
     * @param: []
     * @return: void
     * @author: liuqiang
     * @updateTime: 2018/12/30 19:52
     */
    public void print() {
        Node temp = head.next;
        for (int i = 1; i <= length(); i++) {
            System.out.println("第" + i + "个结点的数据为" + temp.data);
            temp = temp.next;
        }
    }

    /**
     * @Description: 获取中间结点的数据
     * @param: [linkList]
     * @return: void
     * @author: liuqiang
     * @updateTime: 2018/12/30 19:14
     */
    public void getMidNode(LinkList linkList) {
        Node search = linkList.head; // 定义一个快结点
        Node mid = linkList.head; // 定义一个慢结点
        while (search.next != null) { // 遍历单链表
            if (search.next.next != null) {
                // 如果快结点的下下个结点不为空,则说明离最后一个结点至少还有两个结点,往后走两个结点
                search = search.next.next;
            } else {
                // 如果快结点的下下个结点为空,但下个结点不为空,
                // 则说明单链表的结点数为奇数,往后走一个结点即到达最后一个结点
                search = search.next;
            }
            mid = mid.next;
        }
        System.out.println(mid.data);
    }

}

3.测试代码

package bolg;

/**
 * @Description: 测试类
 * @author: liuqiang
 * @Date: 2018/12/30 14:48
 */
public class Test {
    public static void main(String[] args) {
        LinkList linkList = new LinkList();
        // 往单链表中插入多个结点
        for (int i = 1; i < 12; i++) {
            Node node = new Node("结点" + i);
            linkList.addNode(node);
        }

        linkList.getMidNode(linkList); // 调用获得中间结点数据的函数
    }
}

4.输出结果:结点6

猜你喜欢

转载自www.cnblogs.com/iliuqiang/p/10200516.html