add typescript supported
This commit is contained in:
parent
b8098c4677
commit
1ebf877b00
@ -103,8 +103,8 @@ class SingleLinkedList<T> implements List<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class SingleNode<T> {
|
class SingleNode<T> {
|
||||||
value: T
|
public value: T
|
||||||
next: SingleNode<T> | null
|
public next: SingleNode<T> | null
|
||||||
|
|
||||||
constructor(value: T, next: SingleNode<T> | null = null) {
|
constructor(value: T, next: SingleNode<T> | null = null) {
|
||||||
this.value = value
|
this.value = value
|
||||||
|
134
typescript/07_linkedlist/LinkedListAlog.ts
Normal file
134
typescript/07_linkedlist/LinkedListAlog.ts
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/**
|
||||||
|
* 单链表的常见操作包括
|
||||||
|
* 链表反转
|
||||||
|
* 链表中环的检测
|
||||||
|
* 有序链表的合并
|
||||||
|
* 删除链表倒数第n个节点
|
||||||
|
* 链表中间节点
|
||||||
|
*/
|
||||||
|
class LinkedListAlog {
|
||||||
|
/**
|
||||||
|
* 反转链表,依次将节点插入到头部
|
||||||
|
* @param list
|
||||||
|
*/
|
||||||
|
public static reverse<T>(list: SingleNode<T>): SingleNode<T> | null {
|
||||||
|
let currentNode: SingleNode<T> | null = list
|
||||||
|
let prevNode = null
|
||||||
|
while (currentNode) {
|
||||||
|
const nextNode: SingleNode<T> | null = currentNode.next
|
||||||
|
currentNode.next = prevNode
|
||||||
|
prevNode = currentNode
|
||||||
|
currentNode = nextNode
|
||||||
|
}
|
||||||
|
return prevNode
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过快慢指针来检测是否为一个环
|
||||||
|
* @param list
|
||||||
|
*/
|
||||||
|
public static checkCircle<T>(list: SingleNode<T>): boolean {
|
||||||
|
if (!list) return false
|
||||||
|
let fast: SingleNode<T> | null = list.next
|
||||||
|
let slow: SingleNode<T> | null = list
|
||||||
|
while (fast && fast.next) {
|
||||||
|
fast = fast.next.next
|
||||||
|
slow = slow!!.next
|
||||||
|
if (fast === slow) return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 倒序删除节点
|
||||||
|
* @param list
|
||||||
|
* @param index
|
||||||
|
*/
|
||||||
|
public static removeFromEnd<T>(list: SingleNode<T>, index: number): SingleNode<T> | null {
|
||||||
|
// 如果是个环,就没必要找了
|
||||||
|
if (this.checkCircle(list)) return list
|
||||||
|
let newNode = this.reverse(list)
|
||||||
|
let preNode = null
|
||||||
|
let pos = 0
|
||||||
|
while (newNode && pos !== index) {
|
||||||
|
newNode = newNode.next
|
||||||
|
pos++
|
||||||
|
preNode = newNode
|
||||||
|
}
|
||||||
|
if (!newNode) return null
|
||||||
|
if (preNode) {
|
||||||
|
preNode.next = newNode.next
|
||||||
|
}
|
||||||
|
return this.reverse(newNode)
|
||||||
|
}
|
||||||
|
|
||||||
|
public static findMidNode<T>(list: SingleNode<T>): SingleNode<T> | null {
|
||||||
|
if (!list) return null
|
||||||
|
let fast = list.next
|
||||||
|
let slow = list
|
||||||
|
while (fast && fast.next) {
|
||||||
|
fast = fast.next.next
|
||||||
|
slow = slow.next!!
|
||||||
|
}
|
||||||
|
return slow
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 有序链表的合并,根据不同的值进行插入
|
||||||
|
* @param a
|
||||||
|
* @param b
|
||||||
|
*/
|
||||||
|
public static mergeSortedLists<T>(a: SingleNode<T>, b: SingleNode<T>): SingleNode<T> | null {
|
||||||
|
if (!a || !b) return a ? a : b
|
||||||
|
let p: SingleNode<T> | null = a
|
||||||
|
let q: SingleNode<T> | null = b
|
||||||
|
// 新链表的头部指针
|
||||||
|
let newList: SingleNode<T> | null = null
|
||||||
|
if (p.value < q.value) {
|
||||||
|
newList = p
|
||||||
|
p = p.next
|
||||||
|
} else {
|
||||||
|
newList = q
|
||||||
|
q = q.next
|
||||||
|
}
|
||||||
|
let currNode = newList
|
||||||
|
while (p && q) {
|
||||||
|
if (p.value < q.value) {
|
||||||
|
currNode.next = p
|
||||||
|
p = p.next
|
||||||
|
} else {
|
||||||
|
currNode.next = q
|
||||||
|
q = q.next
|
||||||
|
}
|
||||||
|
currNode = currNode.next
|
||||||
|
}
|
||||||
|
if (p) {
|
||||||
|
currNode.next = p
|
||||||
|
} else {
|
||||||
|
currNode.next = q
|
||||||
|
}
|
||||||
|
return newList
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SingleNode<T> {
|
||||||
|
public value: T
|
||||||
|
public next: SingleNode<T> | null
|
||||||
|
|
||||||
|
constructor(value: T, next: SingleNode<T> | null = null) {
|
||||||
|
this.value = value
|
||||||
|
this.next = next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const node1 = new SingleNode(1)
|
||||||
|
node1.next = new SingleNode(3)
|
||||||
|
node1.next.next = new SingleNode(5)
|
||||||
|
|
||||||
|
const node2 = new SingleNode(2)
|
||||||
|
node2.next = new SingleNode(7)
|
||||||
|
node2.next.next = new SingleNode(8)
|
||||||
|
node2.next.next.next = new SingleNode(10)
|
||||||
|
|
||||||
|
console.log(LinkedListAlog.findMidNode(node1))
|
Loading…
Reference in New Issue
Block a user