添加 problem 92

This commit is contained in:
YDZ
2019-03-10 22:01:10 +08:00
parent 33e4de689b
commit 8703367ef0
3 changed files with 122 additions and 0 deletions

View File

@ -0,0 +1,23 @@
# [92. Reverse Linked List II](https://leetcode.com/problems/reverse-linked-list-ii/)
## 题目
Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
```
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
```
## 题目大意
给定 2 个链表中结点的位置 m, n反转这个两个位置区间内的所有结点。
由于有可能整个链表都被反转,所以构造一个新的头结点指向当前的头。之后的处理方法是:找到第一个需要反转的结点的前一个结点 p从这个结点开始依次把后面的结点用“头插”法插入到 p 结点的后面。循环次数用 n-m 来控制。
这一题结点可以原地变化,更改各个结点的 next 指针就可以。不需要游标 p 指针。因为每次逆序以后,原有结点的相对位置就发生了变化,相当于游标指针已经移动了,所以不需要再有游标 p = p.Next 的操作了。

View File

@ -0,0 +1,31 @@
package leetcode
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseBetween(head *ListNode, m int, n int) *ListNode {
if head == nil || m >= n {
return head
}
newHead := &ListNode{Val: 0, Next: head}
pre := newHead
for count := 0; pre.Next != nil && count < m-1; count++ {
pre = pre.Next
}
if pre.Next == nil {
return head
}
cur := pre.Next
for i := 0; i < n-m; i++ {
tmp := pre.Next
pre.Next = cur.Next
cur.Next = cur.Next.Next
pre.Next.Next = tmp
}
return newHead.Next
}

View File

@ -0,0 +1,68 @@
package leetcode
import (
"fmt"
"testing"
)
type question92 struct {
para92
ans92
}
// para 是参数
// one 代表第一个参数
type para92 struct {
one []int
m, n int
}
// ans 是答案
// one 代表第一个答案
type ans92 struct {
one []int
}
func Test_Problem92(t *testing.T) {
qs := []question92{
question92{
para92{[]int{1, 2, 3, 4, 5}, 2, 4},
ans92{[]int{1, 4, 3, 2, 5}},
},
question92{
para92{[]int{1, 2, 3, 4, 5}, 2, 2},
ans92{[]int{1, 2, 3, 4, 5}},
},
question92{
para92{[]int{1, 2, 3, 4, 5}, 1, 5},
ans92{[]int{5, 4, 3, 2, 1}},
},
question92{
para92{[]int{1, 2, 3, 4, 5, 6}, 3, 4},
ans92{[]int{1, 2, 4, 3, 5, 6}},
},
question92{
para92{[]int{3, 5}, 1, 2},
ans92{[]int{5, 3}},
},
question92{
para92{[]int{3}, 3, 5},
ans92{[]int{3}},
},
}
fmt.Printf("------------------------Leetcode Problem 92------------------------\n")
for _, q := range qs {
_, p := q.ans92, q.para92
fmt.Printf("【input】:%v 【output】:%v\n", p, L2s(reverseBetween(S2l(p.one), p.m, p.n)))
}
fmt.Printf("\n\n\n")
}