Skip to content

Commit 6ee45f6

Browse files
committed
Reverse list
1 parent c5c3346 commit 6ee45f6

File tree

3 files changed

+97
-1
lines changed

3 files changed

+97
-1
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package list.manip;
2+
3+
import util.ListNode;
4+
import util.ListUtil;
5+
6+
/**
7+
* Title: 25. K个一组反转链表 Desc: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
8+
* k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 Created by Myth-PC
9+
* on 08/02/2020 in VSCode
10+
*/
11+
public class P25ReverseNodesInKGroup {
12+
public ListNode reverseKGroup(ListNode head, int k) {
13+
ListNode p = head, q = head;
14+
// 找到 第 k-1个结点p
15+
for (int i = 0; i < k; i++) {
16+
if (p == null) return head;
17+
q = p;
18+
p = p.next;
19+
}
20+
q.next = null;
21+
ListNode newHead = reverse(head);
22+
head.next = reverseKGroup(p, k);
23+
return newHead;
24+
}
25+
private ListNode reverse(ListNode head) {
26+
if (head == null || head.next == null) return head;
27+
ListNode ret = reverse(head.next);
28+
head.next.next = head;
29+
head.next = null;
30+
return ret;
31+
}
32+
public static void main(String[] args) {
33+
ListNode list = ListUtil.stringToListNode("[1,2,3,4,5]");
34+
P25ReverseNodesInKGroup p25 = new P25ReverseNodesInKGroup();
35+
ListNode head = p25.reverseKGroup(list, 2);
36+
System.out.println(list.val);
37+
ListUtil.prettyPrintLinkedList(head);
38+
}
39+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package list.manip;
2+
3+
import util.ListNode;
4+
import util.ListUtil;
5+
6+
/**
7+
* Title: 92. 反转链表2
8+
* Desc: 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
9+
* Created by Myth-PC on 08/02/2020 in VSCode
10+
*/
11+
public class P92ReverseLinkedList2 {
12+
public ListNode reverseBetween(ListNode head, int m, int n) {
13+
ListNode oldLast = head, before = null, cur, after;
14+
15+
for (int i = 1; i < m-1; i++) {
16+
oldLast = oldLast.next;
17+
}
18+
ListNode reverseLast = (m == 1 ? head : oldLast.next);
19+
cur = reverseLast;
20+
for (int i = m; i <= n; i++) {
21+
after = cur.next;
22+
cur.next = before;
23+
before = cur;
24+
cur = after;
25+
}
26+
reverseLast.next = cur;
27+
if (m == 1) return before;
28+
oldLast.next = before;
29+
return head;
30+
}
31+
// 设置DummyNode
32+
public ListNode reverseBetween2(ListNode head, int m, int n) {
33+
ListNode dummy = new ListNode(-1);
34+
dummy.next = head;
35+
ListNode oldLast = dummy, before = null, cur, after;
36+
37+
for (int i = 1; i < m; i++) {
38+
oldLast = oldLast.next;
39+
}
40+
ListNode reverseLast = oldLast.next;
41+
cur = reverseLast;
42+
for (int i = m; i <= n; i++) {
43+
after = cur.next;
44+
cur.next = before;
45+
before = cur;
46+
cur = after;
47+
}
48+
reverseLast.next = cur;
49+
oldLast.next = before;
50+
return dummy.next;
51+
}
52+
public static void main(String[] args) {
53+
P92ReverseLinkedList2 p92 = new P92ReverseLinkedList2();
54+
ListNode head = ListUtil.stringToListNode("[1,2,3,4,5]");
55+
ListUtil.prettyPrintLinkedList(p92.reverseBetween2(head, 1, 2));
56+
}
57+
}

src/tree/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
对于树,首先就要弄清前序、中序、后序
44

5-
使用的是递归,将相关操作放在前、中、后要认真思考
5+
基本上所有树的题目都是在遍历的基础上进行修改的

0 commit comments

Comments
 (0)