链表,反转链表
1. 题目描述
难易度:简单
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
2. 思路分析
- 定义节点cur用于遍历整个链表
- 每次保留cur的前驱节点pre,和后继节点curNext
- 将cur的next置为它的前驱pre,此时就是链表的反转
- pre向后移一位则指向cur,cur向后移一位则指向curNext
- 当cur为null时则说明链表遍历结束,此时返回它的前驱节点pre(链表的最后一个节点),即为反转后链表的头节点
3. 代码演示
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) {
return null;
}
//用于遍历链表
ListNode cur = head;
//保存cur的前驱
ListNode pre = null;
//保存cur的next
ListNode curNext = null;
while (cur != null) {
//首先保存cur的next
curNext = cur.next;
//将cur的next置为它的前驱pre
cur.next = pre;
//pre后移,即让pre指向当前的cur
pre = cur;
//cur后移
cur = curNext;
}
//当遍历结束cur为null,则它的前驱节点就是链表的最后一个节点,
// 即为反转后链表的头节点
return pre;
}
}