1. 题目描述
Reverse a singly linked list.
题目描述很简单,翻转一个单向链表
2. 解题思路
思路和以前相同,画一个图。
当进行链表翻转时,将q.next指向p的同时会将q.next指向的节点丢失,所以需要先使用一个指针r指向它。我采用的是一次往后移动一步的方式,也可以一次移动两步,即p直接移动到r,但是移动一步考虑起来比较简单,且边界条件比较容易判断。
3. Code
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
// 三个指针,断开一个节点的时候他左右的节点都会丢失
public ListNode reverseList(ListNode head) {
ListNode p = head, q, r;
// 如果只有一个节点或为空,直接return
if(head == null || head.next == null)
{
return head;
}
q = p.next; // 前三个节点指向前三个位置
r = q.next;
p.next = null; // 断开第一个p->q
while (r != null)
{
q.next = p; // 断开p、q
// 三个指针后移
p = q;
q = r;
r = r.next;
}
// 连接最后一个p->q
q.next = p;
head = q;
return head;
}
}