Skip to content

Commit e15aa3d

Browse files
Merge branch 'master' into master
2 parents 654e2a9 + 6ea6956 commit e15aa3d

11 files changed

+594
-2
lines changed

problems/0019.删除链表的倒数第N个节点.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,71 @@ var removeNthFromEnd = function(head, n) {
181181
return ret.next;
182182
};
183183
```
184+
TypeScript:
185+
186+
版本一(快慢指针法):
187+
188+
```typescript
189+
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
190+
let newHead: ListNode | null = new ListNode(0, head);
191+
let slowNode: ListNode | null = newHead,
192+
fastNode: ListNode | null = newHead;
193+
for (let i = 0; i < n; i++) {
194+
fastNode = fastNode.next;
195+
}
196+
while (fastNode.next) {
197+
fastNode = fastNode.next;
198+
slowNode = slowNode.next;
199+
}
200+
slowNode.next = slowNode.next.next;
201+
return newHead.next;
202+
};
203+
```
204+
205+
版本二(计算节点总数法):
206+
207+
```typescript
208+
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
209+
let curNode: ListNode | null = head;
210+
let listSize: number = 0;
211+
while (curNode) {
212+
curNode = curNode.next;
213+
listSize++;
214+
}
215+
if (listSize === n) {
216+
head = head.next;
217+
} else {
218+
curNode = head;
219+
for (let i = 0; i < listSize - n - 1; i++) {
220+
curNode = curNode.next;
221+
}
222+
curNode.next = curNode.next.next;
223+
}
224+
return head;
225+
};
226+
```
227+
228+
版本三(递归倒退n法):
229+
230+
```typescript
231+
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
232+
let newHead: ListNode | null = new ListNode(0, head);
233+
let cnt = 0;
234+
function recur(node) {
235+
if (node === null) return;
236+
recur(node.next);
237+
cnt++;
238+
if (cnt === n + 1) {
239+
node.next = node.next.next;
240+
}
241+
}
242+
recur(newHead);
243+
return newHead.next;
244+
};
245+
```
246+
184247
Kotlin:
248+
185249
```Kotlin
186250
fun removeNthFromEnd(head: ListNode?, n: Int): ListNode? {
187251
val pre = ListNode(0).apply {

problems/0024.两两交换链表中的节点.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,38 @@ var swapPairs = function (head) {
250250
};
251251
```
252252

253+
TypeScript:
254+
255+
```typescript
256+
function swapPairs(head: ListNode | null): ListNode | null {
257+
/**
258+
* 初始状态:
259+
* curNode -> node1 -> node2 -> tmepNode
260+
* 转换过程:
261+
* curNode -> node2
262+
* curNode -> node2 -> node1
263+
* curNode -> node2 -> node1 -> tempNode
264+
* curNode = node1
265+
*/
266+
let retNode: ListNode | null = new ListNode(0, head),
267+
curNode: ListNode | null = retNode,
268+
node1: ListNode | null = null,
269+
node2: ListNode | null = null,
270+
tempNode: ListNode | null = null;
271+
272+
while (curNode && curNode.next && curNode.next.next) {
273+
node1 = curNode.next;
274+
node2 = curNode.next.next;
275+
tempNode = node2.next;
276+
curNode.next = node2;
277+
node2.next = node1;
278+
node1.next = tempNode;
279+
curNode = node1;
280+
}
281+
return retNode.next;
282+
};
283+
```
284+
253285
Kotlin:
254286

255287
```kotlin

problems/0034.在排序数组中查找元素的第一个和最后一个位置.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ func getRight(nums []int, target int) int {
432432
}
433433
}
434434
return border
435+
435436
}
436437
```
437438

problems/0101.对称二叉树.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,87 @@ var isSymmetric = function(root) {
574574
};
575575
```
576576

577+
## Swift:
577578

579+
> 递归
580+
```swift
581+
func isSymmetric(_ root: TreeNode?) -> Bool {
582+
return _isSymmetric(root?.left, right: root?.right)
583+
}
584+
func _isSymmetric(_ left: TreeNode?, right: TreeNode?) -> Bool {
585+
// 首先排除空节点情况
586+
if left == nil && right == nil {
587+
return true
588+
} else if left == nil && right != nil {
589+
return false
590+
} else if left != nil && right == nil {
591+
return false
592+
} else if left!.val != right!.val {
593+
// 进而排除数值不相等的情况
594+
return false
595+
}
596+
597+
// left 和 right 都不为空, 且数值也相等就递归
598+
let inSide = _isSymmetric(left!.right, right: right!.left)
599+
let outSide = _isSymmetric(left!.left, right: right!.right)
600+
return inSide && outSide
601+
}
602+
```
603+
604+
> 迭代 - 使用队列
605+
```swift
606+
func isSymmetric2(_ root: TreeNode?) -> Bool {
607+
guard let root = root else {
608+
return true
609+
}
610+
var queue = [TreeNode?]()
611+
queue.append(root.left)
612+
queue.append(root.right)
613+
while !queue.isEmpty {
614+
let left = queue.removeFirst()
615+
let right = queue.removeFirst()
616+
if left == nil && right == nil {
617+
continue
618+
}
619+
if left == nil || right == nil || left?.val != right?.val {
620+
return false
621+
}
622+
queue.append(left!.left)
623+
queue.append(right!.right)
624+
queue.append(left!.right)
625+
queue.append(right!.left)
626+
}
627+
return true
628+
}
629+
```
630+
631+
> 迭代 - 使用栈
632+
```swift
633+
func isSymmetric3(_ root: TreeNode?) -> Bool {
634+
guard let root = root else {
635+
return true
636+
}
637+
var stack = [TreeNode?]()
638+
stack.append(root.left)
639+
stack.append(root.right)
640+
while !stack.isEmpty {
641+
let left = stack.removeLast()
642+
let right = stack.removeLast()
643+
644+
if left == nil && right == nil {
645+
continue
646+
}
647+
if left == nil || right == nil || left?.val != right?.val {
648+
return false
649+
}
650+
stack.append(left!.left)
651+
stack.append(right!.right)
652+
stack.append(left!.right)
653+
stack.append(right!.left)
654+
}
655+
return true
656+
}
657+
```
578658

579659
-----------------------
580660
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0104.二叉树的最大深度.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,5 +653,82 @@ int maxDepth(struct TreeNode* root){
653653
}
654654
```
655655

656+
## Swift
657+
658+
>二叉树最大深度
659+
```swift
660+
// 递归 - 后序
661+
func maxDepth1(_ root: TreeNode?) -> Int {
662+
return _maxDepth1(root)
663+
}
664+
func _maxDepth1(_ root: TreeNode?) -> Int {
665+
if root == nil {
666+
return 0
667+
}
668+
let leftDepth = _maxDepth1(root!.left)
669+
let rightDepth = _maxDepth1(root!.right)
670+
return 1 + max(leftDepth, rightDepth)
671+
}
672+
673+
// 层序
674+
func maxDepth(_ root: TreeNode?) -> Int {
675+
guard let root = root else {
676+
return 0
677+
}
678+
var queue = [TreeNode]()
679+
queue.append(root)
680+
var res: Int = 0
681+
while !queue.isEmpty {
682+
res += 1
683+
for _ in 0 ..< queue.count {
684+
let node = queue.removeFirst()
685+
if let left = node.left {
686+
queue.append(left)
687+
}
688+
if let right = node.right {
689+
queue.append(right)
690+
}
691+
}
692+
}
693+
return res
694+
}
695+
```
696+
697+
>N叉树最大深度
698+
```swift
699+
// 递归
700+
func maxDepth(_ root: Node?) -> Int {
701+
guard let root = root else {
702+
return 0
703+
}
704+
var depth = 0
705+
for node in root.children {
706+
depth = max(depth, maxDepth(node))
707+
}
708+
return depth + 1
709+
}
710+
711+
// 迭代-层序遍历
712+
func maxDepth1(_ root: Node?) -> Int {
713+
guard let root = root else {
714+
return 0
715+
}
716+
var depth = 0
717+
var queue = [Node]()
718+
queue.append(root)
719+
while !queue.isEmpty {
720+
let size = queue.count
721+
depth += 1
722+
for _ in 0 ..< size {
723+
let node = queue.removeFirst()
724+
for child in node.children {
725+
queue.append(child)
726+
}
727+
}
728+
}
729+
return depth
730+
}
731+
```
732+
656733
-----------------------
657734
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

0 commit comments

Comments
 (0)