算法:链表

99 阅读1分钟

1.反转链表

思路:用_next记录下一个节点,pre记录当前一个节点,然后把当前节点的next指向上一个pre
function ReverseList(pHead)
{
    let pre = null;
    let _next = null;
    while(pHead){
       _next = pHead.next;
        pHead.next=pre;
        pre = pHead;
        pHead = _next;
    }
    return pre;
}
module.exports = {
    ReverseList : ReverseList
};

2.判断链表是否有环 思路:快慢指针:快指针pf每次移动2个节点,慢指针ps每次移动1个节点,如果快指针能够追上慢指针,那就说明其中有一个环,否则不存在环。这个方法的时间复杂度为O(n),空间复杂度为O(1),实际使用两个指针。

function hasCycle( head ) {
    let pf = head
    let ps = head
    if( !(head && head.next && head.next.next) )
        return false
    while(pf && pf.next)
        {
            pf = pf.next.next
            ps = ps.next
            if(pf === ps)
                return true
        }
    return false
}
module.exports = {
    hasCycle : hasCycle
};