反转单向链表

125 阅读1分钟
创建一个单向的链表

根据一个数组创建一个单向的链表,先把数组的最后一项定义为链表的未端,倒着遍历数组,依次把 next 指向上次的 currNode,最后返回链表的头

interface IlinkNode {
    value: any;
    next?: IlinkNode
}

function createLinkList(arr: any[]): IlinkNode | null {
    if (!arr.length) { return null }
    let currNode: IlinkNode = {
        value: arr[arr.length - 1]
    }
    for (let i = arr.length - 2; i >= 0; i--) {
        currNode = {
            value: arr[i],
            next: currNode
        }
    }
    return currNode
}
反转单向链表
  1. 设置3个指针 preNode, currNode, nextNode ,依次统一往后移,
  2. while(nextNode.next) 已nextNode为依据遍历
  3. preNode = currNode currNode = nextNode nextNode = nextNode.next 大胆往后挪,当前的挪给上一个,nextNode 挪给 currNode, nextNode.next 挪给 nextNode, 这样就统一挪了一位,
  4. 挪过以后,如果有 preNode, currNode.next = preNode
  5. 当最后没有 nextNode.next,停止遍历, 最后的点的 next 指向 currNode
  6. 返回的 nextNode 就是链表的 head
function reveseLinkList(node: IlinkNode): IlinkNode{
    let preNode: IlinkNode | null = null
    let currNode: IlinkNode | null = null
    let nextNode = node
    while(nextNode.next){
        preNode = currNode
        currNode = nextNode
        nextNode = nextNode.next
        
        // 头上的节点就是尾节点,所以没有 next
        if (!preNode && currNode) {
            delete currNode.next
        } 
        if(preNode){
          currNode.next = preNode
        }

    }
    nextNode.next = currNode
    return nextNode
}