小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000] -5000 <= Node.val <= 5000
题解
1.双指针
定义变量
左指针作为当前循环的最后一个节点,不用移动,就是原来链表的头部
右指针用于移动链表,标记下一次需要操作的节点
temp临时指针用于存储这次循环需要操作的最新节点.
newHead 用于存储目前最新的头结点,实际上就是上个循环的最新节点
流程
1.用temp记录下当前需要操作的节点,右指针向下移动,用于标记下一次循环需要操作的节点
2.将temp的下一个节点设置成newHead,那么temp就变成了最新的头结点
3.此时的left指针的下一个节点变成了right(下一次循环需要操作的节点)
4.newHead变成了temp
那么这样一次循环下来,就能将加入的节点变成了头结点,尾指针left 指向了下一个需要操作的节点,当下一个操作的节点为null时,代表已经将整个链表转换完成
public ListNode reverseList(ListNode head) {
// 特殊情况,纯属恶心人
if (null == head) {
return head;
}
// 左右指针,左指针指向头部,不需要移动,右指针需要依次向后移动
ListNode left = head;
ListNode right = head.next;
// temp用于保存原来的下一个节点,newHead用来储存最新的头指针,用于下一个节点指向头部
ListNode temp;
ListNode newHead = left;
while (null != right) {
// 记下右指针的原来的下一个节点
temp = right;
right = right.next;
// 将右指针的下一个节点转移到头指针
temp.next = newHead;
// 现在的头指针变成了右指针
left.next = right;
newHead = temp;
}
return newHead;
}