206. 反转链表
题目:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
思路:
递归:
先递归到底, 找到最后一个节点, 然后从最后一个节点开始, 把箭头方向掉转,
递归结束的条件:终止条件是当前节点或者下一个节点==null,
得到最后一个节点之后, 返回给上一层递归, p指向原链表的最后一个节点, 现在要作为头节点, 之后的p都不需要改动, 不断返回给上一层递归,
改变head的next的指向, 让它指向自己,再把head的next指向空, 作为新链表的最后一个节点,递归结束, 最后返回的还是p(头节点)
迭代:
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
// //递归结束的条件
// if (head == null || head.next == null) {
// return head;
// }
// //p指向原链表的最后一个结点
// ListNode p = reverseList(head.next);
// //改变head的next的指向, 让它指向自己
// head.next.next = head;
// //再把head的next指向空, 作为新链表的最后一个节点
// head.next = null;
// //递归结束,最后返回的还是p(头节点)
// return p;
//迭代
ListNode pre = null; //新链表最后结点
ListNode cur = head; //当前待添加到新链表的结点
while (cur != null) {
ListNode tmp = cur.next; //记录当前结点的下一个结点
//将当前结点指向pre
cur.next = pre;
//pre、cur前进一位
pre = cur;
cur = tmp;
}
return pre;
}
}
转载:
如有冒犯请私信我删除
链接:https://leetcode.cn/problems/reverse-linked-list/solution/die-dai-by-javaniuniu/