Skip to content

Commit 48c742b

Browse files
authored
Add file reverse-linked-list-ii.go
1 parent f83c1d6 commit 48c742b

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

reverse-linked-list-ii.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"bytes"
6+
)
7+
8+
type ListNode struct {
9+
Val int
10+
Next *ListNode
11+
}
12+
13+
func (n *ListNode) String() string {
14+
var buf bytes.Buffer
15+
for nn := n; nn != nil; nn = nn.Next {
16+
buf.WriteString(fmt.Sprintf("[%d]", nn.Val))
17+
}
18+
return buf.String()
19+
}
20+
21+
func reverseBetween(head *ListNode, m int, n int) *ListNode {
22+
if head == nil || head.Next == nil || m <= 0 || n <= 0 || m >= n {
23+
return head
24+
}
25+
mNode, nNode := findSubList(head, m, n)
26+
if mNode == nil || nNode == nil || mNode == nNode {
27+
return head
28+
}
29+
nextSubNode := nNode.Next
30+
h, t := doReverse(mNode, nNode)
31+
t.Next = nextSubNode
32+
if t == head {
33+
return h
34+
}
35+
36+
for n := head; n != nil; n = n.Next {
37+
if n.Next == t {
38+
n.Next = h
39+
break
40+
}
41+
}
42+
return head
43+
}
44+
45+
func doReverse(head, tail *ListNode) (*ListNode, *ListNode) {
46+
if head == nil || tail == nil || head == tail {
47+
return tail, head
48+
}
49+
pre, cur, next := head, head.Next, head.Next.Next
50+
for {
51+
cur.Next = pre
52+
if cur == tail {
53+
break
54+
}
55+
pre = cur
56+
cur = next
57+
next = next.Next
58+
}
59+
head.Next = nil
60+
return tail, head
61+
}
62+
63+
func findSubList(head *ListNode, m, n int) (mNode, nNode *ListNode) {
64+
if head == nil {
65+
return nil, nil
66+
}
67+
mNode, nNode = head, head
68+
for i := 1; i < n; i++ {
69+
if i < m {
70+
mNode = mNode.Next
71+
if mNode == nil {
72+
return
73+
}
74+
}
75+
nNode = nNode.Next
76+
if nNode == nil {
77+
return
78+
}
79+
}
80+
return
81+
}
82+
83+
func main() {
84+
h := &ListNode{1, &ListNode{2, &ListNode{3, &ListNode{4, &ListNode{5, nil}}}}}
85+
//h := &ListNode{3, &ListNode{5, nil}}
86+
fmt.Println(h)
87+
fmt.Println(reverseBetween(h, 3, 4))
88+
}

0 commit comments

Comments
 (0)