题目描述:
输入一个链表,反转链表后,输出新链表的表头。
思路:
思路1:
1. 最简单的 使用一个栈
思路2:
a -> b -> c
将b节点的指针指向a节点即可,但是会导致无法找到c节点,所以使用三个节点
1. 使用三个指针 p, q, k 分别指向a, b, c
2. q.next = p;
p = q;
q = k;
k = k.next
3. 循环结束条件k == null
4. 循环结束时如同a -- b -> null 还需要将b指向a。
此时a是指向的前一个节点。
q.next = p;
代码
import DateStructure.ListNode;
public class ReverseList {
public static ListNode reverseList(ListNode head) {
if (head == null)
return null;
if (head.next == null)
return head;
ListNode p = head;
ListNode q = head.next;
ListNode k = q.next;
head.next = null; // 将头节点的指针置为空
while (k != null) {
q.next = p; // 调换方向
p = q; // 向后迭代
q = k;
k = k.next;
}
// 循环结束时,是情况4还需要将 q指向p;
q.next = p;
return q;
}
public static void main(String[] args) {
ListNode l = new ListNode(1);
ListNode p = l;
for (int i = 2; i < 3; i++) {
p.next = new ListNode(i);
p = p.next;
}
p = l;
while (p != null) {
System.out.println(p.val);
p = p.next;
}
ListNode rl = reverseList(l);
while (rl != null) {
System.out.println(rl.val);
rl = rl.next;
}
}
}