Skip to content

Commit 1ebf877

Browse files
committed
add typescript supported
1 parent b8098c4 commit 1ebf877

File tree

2 files changed

+136
-2
lines changed

2 files changed

+136
-2
lines changed

typescript/06_linkedlist/SingleLinkedList.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ class SingleLinkedList<T> implements List<T> {
103103
}
104104

105105
class SingleNode<T> {
106-
value: T
107-
next: SingleNode<T> | null
106+
public value: T
107+
public next: SingleNode<T> | null
108108

109109
constructor(value: T, next: SingleNode<T> | null = null) {
110110
this.value = value
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/**
2+
* 单链表的常见操作包括
3+
* 链表反转
4+
* 链表中环的检测
5+
* 有序链表的合并
6+
* 删除链表倒数第n个节点
7+
* 链表中间节点
8+
*/
9+
class LinkedListAlog {
10+
/**
11+
* 反转链表,依次将节点插入到头部
12+
* @param list
13+
*/
14+
public static reverse<T>(list: SingleNode<T>): SingleNode<T> | null {
15+
let currentNode: SingleNode<T> | null = list
16+
let prevNode = null
17+
while (currentNode) {
18+
const nextNode: SingleNode<T> | null = currentNode.next
19+
currentNode.next = prevNode
20+
prevNode = currentNode
21+
currentNode = nextNode
22+
}
23+
return prevNode
24+
}
25+
26+
/**
27+
* 通过快慢指针来检测是否为一个环
28+
* @param list
29+
*/
30+
public static checkCircle<T>(list: SingleNode<T>): boolean {
31+
if (!list) return false
32+
let fast: SingleNode<T> | null = list.next
33+
let slow: SingleNode<T> | null = list
34+
while (fast && fast.next) {
35+
fast = fast.next.next
36+
slow = slow!!.next
37+
if (fast === slow) return true
38+
}
39+
return false
40+
}
41+
42+
/**
43+
* 倒序删除节点
44+
* @param list
45+
* @param index
46+
*/
47+
public static removeFromEnd<T>(list: SingleNode<T>, index: number): SingleNode<T> | null {
48+
// 如果是个环,就没必要找了
49+
if (this.checkCircle(list)) return list
50+
let newNode = this.reverse(list)
51+
let preNode = null
52+
let pos = 0
53+
while (newNode && pos !== index) {
54+
newNode = newNode.next
55+
pos++
56+
preNode = newNode
57+
}
58+
if (!newNode) return null
59+
if (preNode) {
60+
preNode.next = newNode.next
61+
}
62+
return this.reverse(newNode)
63+
}
64+
65+
public static findMidNode<T>(list: SingleNode<T>): SingleNode<T> | null {
66+
if (!list) return null
67+
let fast = list.next
68+
let slow = list
69+
while (fast && fast.next) {
70+
fast = fast.next.next
71+
slow = slow.next!!
72+
}
73+
return slow
74+
}
75+
76+
/**
77+
* 有序链表的合并,根据不同的值进行插入
78+
* @param a
79+
* @param b
80+
*/
81+
public static mergeSortedLists<T>(a: SingleNode<T>, b: SingleNode<T>): SingleNode<T> | null {
82+
if (!a || !b) return a ? a : b
83+
let p: SingleNode<T> | null = a
84+
let q: SingleNode<T> | null = b
85+
// 新链表的头部指针
86+
let newList: SingleNode<T> | null = null
87+
if (p.value < q.value) {
88+
newList = p
89+
p = p.next
90+
} else {
91+
newList = q
92+
q = q.next
93+
}
94+
let currNode = newList
95+
while (p && q) {
96+
if (p.value < q.value) {
97+
currNode.next = p
98+
p = p.next
99+
} else {
100+
currNode.next = q
101+
q = q.next
102+
}
103+
currNode = currNode.next
104+
}
105+
if (p) {
106+
currNode.next = p
107+
} else {
108+
currNode.next = q
109+
}
110+
return newList
111+
}
112+
}
113+
114+
class SingleNode<T> {
115+
public value: T
116+
public next: SingleNode<T> | null
117+
118+
constructor(value: T, next: SingleNode<T> | null = null) {
119+
this.value = value
120+
this.next = next
121+
}
122+
}
123+
124+
125+
const node1 = new SingleNode(1)
126+
node1.next = new SingleNode(3)
127+
node1.next.next = new SingleNode(5)
128+
129+
const node2 = new SingleNode(2)
130+
node2.next = new SingleNode(7)
131+
node2.next.next = new SingleNode(8)
132+
node2.next.next.next = new SingleNode(10)
133+
134+
console.log(LinkedListAlog.findMidNode(node1))

0 commit comments

Comments
 (0)