题目描述
输入一个链表,反转链表后,输出新链表的表头。
思路:我们要正确反转一个链表,就需要调整链表指针的方向。
如图所示,要调整h,i,j之间的指针方向,现在假设h以前的都已经调整好了。那么下一步,我们就要把i指向h,那么这样就会导致i到j之间的指针断裂,不能遍历到j。因此在调整结点i的指针之前,我们除了要知道i结点,还需要i之前的h结点,要把结点i的next指针指向h结点,并且为了防止链表断开,我们事先还要保存i的下一个结点j。那么我们就要定义3个指针,分别指向当前遍历到的结点、它的前一个结点以及后一个结点。
// 反转链表
public class Solution {
class ListNode {
int val;
ListNode next = null;
ListNode(int x) {
val = x;
}
}
public ListNode ReverseList(ListNode head) {
if (head == null) {
return null;
}
// 定义反转后的结点,也就是当前结点的后一个结点
ListNode pReverseHead = null;
// 定义当前结点
ListNode pNode = head;
// 定义当前结点的前一个结点
ListNode pPreNode = null;
while (pNode != null) {
ListNode pNext = pNode.next;
if (pNext == null) {
pReverseHead = pNode;
}
// 调整指针指向前一个结点
pNode.next = pPreNode;
pPreNode = pNode;
pNode = pNext;
}
return pReverseHead;
}
}