单向链表实现

孩子们的游戏(圆圈中最后剩下的数)

http://www.nowcoder.com/questionTerminal/f78a359491e64a50bce2d89cff857eb6

public class Solution {

public int LastRemaining_Solution(int n, int m) {

    if (n <= 0) return -1;

    m -= 1;

    SingleCircleLinkedList1 list = new SingleCircleLinkedList1();

    for (int i = 0; i < n; i++) {

        list.add(i);
    }

    list.reset();

    while (list.size() != 1) {

        for (int i = 0; i < m; i++) {

            list.next();
        }

        list.remove(); // 每次只删掉一个人
    }

    return list.get(0);

}

// public static void main(String[] args) {
//
// Solution solution = new Solution();
//
// int i = solution.LastRemaining_Solution(5, 3);
//
// System.out.println(i);
//
// }
}

class SingleCircleLinkedList1 {

private int size;

private Node first;

private Node current;

private static class Node {

    int val;

    Node next;

    public Node(int val, Node next) {

        this.val = val;
        this.next = next;
    }
}

public int size() {

    return size;
}


public int get(int index) {

    Node node = first;

    for (int i = 0; i < index; i++) {

        node = node.next;
    }

    return node.val;
}


public void add(int val) {

    if (size == 0) {


        first = new Node(val, null);

        first.next = first;

    } else {

        Node prev = first;

        for (int i = 0; i < size - 1; i++) {

            prev = prev.next;
        }

        prev.next = new Node(val, prev.next);
    }

    size++;

}


private int remove(Node node) {

    if (node == first) {

        if (size == 1) {

            first = null;

        } else {

            Node last = first;

            for (int i = 0; i < size - 1; i++) {

                last = last.next;
            }

            first = first.next;

            last.next = first;
        }



    } else {

        Node prev = first;

        while (prev.next != node) {

            prev = prev.next;

        }

        prev.next = node.next;
    }

    size--;

    return node.val;
}


public void reset() {

    current = first;
}


public int next() {

    if (current == null) return -1;

    current = current.next;

    return current.val;
}


public int remove() {

    if (current == null) return -1;

    int val = this.remove(current);

    if (size == 0) {

        current = null;

    } else {

        current = current.next;
    }

    return val;
}

}

全部评论

相关推荐

神哥了不得:神哥来啦~有可能只是为了注册账号,这个平台必须发一个招聘才能注册成功的
点赞 评论 收藏
分享
华泰证券信息技术部 软开 月base2.2w,年终要看当年收益,HR讲往年应届平均35W
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务