一、反转链表一(简单)
(一)、题目要求
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
(二)、解法
public class Solution {
public static ListNode reverseList(ListNode head) {
if (head == null) {
return head;
}
ListNode pre = head;
ListNode current = head.next;
pre.next = null;
while (current != null) {
ListNode next = current.next;
current.next = pre;
pre = current;
current = next;
}
return pre;
}
}
(三)、测试用例
public class Test {
public static void main(String[] args) {
// 空链表测试
ListNode empty = null;
empty = Solution.reverseList(empty);
System.out.println("空链表测试");
show(empty);
// 一个节点链表测试
ListNode one = new ListNode(1);
one = Solution.reverseList(one);
System.out.println("一个节点链表测试");
show(one);
// 两个节点链表测试
ListNode two = new ListNode(1);
two.next = new ListNode(2);
two = Solution.reverseList(two);
System.out.println("两个节点链表测试");
show(two);
// 正常链表测试
ListNode list = new ListNode(1);
list.next = new ListNode(2);
list.next.next = new ListNode(3);
list = Solution.reverseList(list);
System.out.println("正常链表测试");
show(list);
}
private static void show(ListNode node) {
while (node != null) {
System.out.println(node.val);
node = node.next;
}
}
}
(四)、流程图分析
1、初始状态:
2、设立pre节点与current节点
3、第一次开始反转节点指向
4、第二次开始反转节点指向
5、反转结束
二、反转链表二(中等)
(一)、题目要求
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
(二)、解法
public class Solution {
public static ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null || m > n) {
return head;
}
ListNode dummy = new ListNode(-1);
dummy.next = head;
head = dummy;
for (int i = 1; i < m; i++) {
head = head.next;
}
ListNode preM = head;
ListNode mNode = head.next;
ListNode nNode = mNode;
ListNode postN = nNode.next;
for (int i = m; i < n; i++) {
ListNode next = postN.next;
postN.next = nNode;
nNode = postN;
postN = next;
}
preM.next = nNode;
mNode.next = postN;
return dummy.next;
}
}
(三)、测试用例
public class Test {
public static void main(String[] args) {
// 空链表测试
ListNode empty = null;
empty = Solution.reverseBetween(empty, 1, 1);
show(empty);
// 一个节点链表测试
ListNode one = new ListNode(1);
one = Solution.reverseBetween(one, 1, 1);
System.out.println("一个节点链表测试");
show(one);
// 两个节点链表测试
ListNode two = new ListNode(1);
two.next = new ListNode(2);
two = Solution.reverseBetween(two, 1, 2);
System.out.println("两个节点链表测试");
show(two);
// 正常链表测试
ListNode list = new ListNode(1);
list.next = new ListNode(2);
list.next.next = new ListNode(3);
list.next.next.next = new ListNode(4);
list.next.next.next.next = new ListNode(5);
list = Solution.reverseBetween(list, 1, 4);
System.out.println("正常链表测试");
show(list);
// m>n的参数测试
list = Solution.reverseBetween(list, 4, 2);
System.out.println("m>n的参数测试");
show(list);
// 从head节点开始进行反转
list = Solution.reverseBetween(list, 1, 4);
System.out.println("从head节点开始进行反转");
show(list);
}
private static void show(ListNode node) {
while (node != null) {
System.out.println(node.val);
node = node.next;
}
}
}
(四)、流程图分析
1、初始状态
2、设立dummy节点,并head指向dummy
3、寻找到mNode、nNode等节点的初始位置
4、开始反转
5、反转结束
6、调整next指针位置
7、重新排版位置