题目:
输入一个链表,反转链表后,输出新链表的表头。
思路:
- 创建 head 节点的 pre 和 preserve_next
- 用 preserve_next 保存 head 节点的 next 节点,使得单链表不会因为没有 next 节点断裂
- 将 head 节点指向 next 节点变为指向 pre 节点,单次反转完毕
- 将 pre、 head、 next 三个节点依次向后移动一个节点,继续下一次反转
- 当 head 为空时,pre 就是链表的最后一个节点,此时链表已经反转完毕,意味着 pre 就是新链表的表头节点
代码:
package 反转链表;
class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
/**
* 输入一个链表,反转链表后,输出新链表的表头。
*
* @author Administrator
*/
class Solution {
public ListNode ReverseList(ListNode head) {
if (head == null) {
return null;
}
ListNode pre = null;
ListNode next = null;
while (head != null) {
// 如果当前节点不为空的话,始终执行次循环,目的是为了让 head 节点从指向 next 节点变为指向 pre 节点
// 用 next 保存 head 的下一个节点值,保证单链表不会因为失去 head 节点的 next 节点而断裂
next = head.next;
// 保存完 next,就可以让 head 节点从指向 next 节点变为指向 pre 节点了
head.next = pre;
// head 指向 pre 节点后,继续依次反转下一个结点
// 让 pre、head、next 依次向后移动一个节点,继续下一次的指针反转
pre = head;
head = next;
}
// 如果 head 节点为空时,pre 就是最后一个节点了,此时链表已经反转完毕,意味着 pre 是反转后的第一个节点
// 直接输出 pre 就是我们想要得到的反转后的链表的表头节点。
return pre;
}
}
public class Demo {
public static void main(String[] args) {
ListNode listNode = new ListNode(1);
listNode.next = new ListNode(2);
listNode.next.next = new ListNode(3);
listNode.next.next.next = new ListNode(4);
listNode.next.next.next.next = new ListNode(5);
Solution solution = new Solution();
ListNode reverseList = solution.ReverseList(listNode);
System.out.println(reverseList.val);
}
}