206.反转链表
这道题有两种解法,但不只有两种,嘿嘿。
法一:迭代法
就是按循序遍历将每一个指针的指向都给改了。比如说1——>2——>3改为null<——1<——2<——3这样。那这里以第二个结点为例,想一想。我想要指向本身的指针改为指向1,那我是不是要获取它前一个结点的值,那这怎么获取呢,所以需要用一个指针来保存前一个结点。同理,当我成功的将指向本身的箭头更改之后,那我原本元素的下一个咋整,还能找到吗,所以又需要设立一个指针用以保存后面的原本的值。说的可能很复杂,但是代码很简单。
代码:
(参考官方的,因为我现在还在学习阶段)
/**
* 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) {
//1、迭代
//pre用于存储当前结点的前一个结点
ListNode pre=null;
ListNode curr=head;
while(curr!=null){
//next指针用于存储当前结点的后一个结点
ListNode next=curr.next;
curr.next=pre;
pre=curr;
curr=next;
}
return pre;
}
}
法二:递归
这个我比较喜欢。
题解:
用递归,直到当前结点p,的p-next=null则返回其本身。然后回到上一个结点。
head.next.next=head;
head.next=null;
这两行代码的作用在于将当前结点的p-next=null,同时将当前结点的下一个结点的next指向本身,将箭头调换,指向自己,但不是自杀,只是为了完成任务而已(开个玩笑)。
我觉得可能会卡在对递归的理解,多多刷题,多多思考,相信自己,就ok了。
代码:
/**
* 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) {
//2、递归
if(head==null||head.next==null){
return head;
}
ListNode newHead=reverseList(head.next);
//反转吧
head.next.next=head;
head.next=null;
return newHead;
}
}