forked from kexun/sort
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReverseList.java
141 lines (121 loc) · 2.23 KB
/
ReverseList.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.demo;
/**
* 反转单向或双向链表
* @author kexun
*
*/
public class ReverseList {
public static void main(String[] args) {
Node n1 = new ReverseList().new Node(1);
Node n2 = new ReverseList().new Node(2);
Node n3 = new ReverseList().new Node(3);
Node n4 = new ReverseList().new Node(4);
Node n5 = new ReverseList().new Node(5);
Node n6 = new ReverseList().new Node(6);
Node n7 = new ReverseList().new Node(7);
Node n8 = new ReverseList().new Node(8);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n7;
n7.next = n8;
ReverseList r = new ReverseList();
Node n = r.reverseListFromTo(n1, 1, 9);
while (n != null) {
System.out.println(n.data);
n = n.next;
}
}
/**
* 反转单向链表
* @param head
* @return
*/
public Node reverseList(Node head) {
if (head == null) {
return head;
}
Node pre = null;
Node curr = null;
while (head != null) {
curr = head.next;
head.next = pre;
pre = head;
head = curr;
}
return pre;
}
class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
class DNode {
int data;
DNode next;
DNode pre;
public DNode(int data) {
this.data = data;
}
}
public DNode reverseDlist(DNode head) {
if (head == null) {
return null;
}
DNode pre = null;
DNode next = null;
while (head != null) {
next = head.next;
head.next = pre;
head.pre = next;
pre = head;
head = next;
}
return pre;
}
/**
* 反转部分单向链表
* @param head
* @param from
* @param to
* @return
*/
public Node reverseListFromTo(Node head, int from, int to) {
Node curr = head;
Node pre = null;
Node next = null;
int index = 1;
Node tempPre = null;
Node tempCur = null;
while (index < from) {
index++;
next = curr.next;
pre = curr;
curr = next;
}
tempPre = pre;
if (pre == null) {
tempCur = curr;
} else {
tempCur = pre.next;
}
while (index <= to && curr != null) {
index++;
next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
tempCur.next = curr;
if (tempPre == null) {
return pre;
} else {
tempPre.next = pre;
return head;
}
}
}