创建一个单向的链表
根据一个数组创建一个单向的链表,先把数组的最后一项定义为链表的未端,倒着遍历数组,依次把 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
}
反转单向链表
- 设置3个指针 preNode, currNode, nextNode ,依次统一往后移,
while(nextNode.next)已nextNode为依据遍历preNode = currNodecurrNode = nextNodenextNode = nextNode.next大胆往后挪,当前的挪给上一个,nextNode 挪给 currNode, nextNode.next 挪给 nextNode, 这样就统一挪了一位,- 挪过以后,如果有 preNode, currNode.next = preNode
- 当最后没有 nextNode.next,停止遍历, 最后的点的 next 指向 currNode
- 返回的 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
}