反转链表的概念以及含义
反转链表实现的效果如下图所示:
反转链表的概念是,首先,我输入的链表,将以相反的顺序返回给我,返回的类型仍然是一个链表。
我们首先对链表进行一个设置:
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;
}
}
链表中存在两个重要的值,一个next指向链表的下一个元素,val是当前元素的值。
思路1:创建两个链表
构建两个链表,n1,n2
n1指向传入的链表,n2为最终返回链表。
此时,n2最开始为空;
我们从n1中读取一个链表的值,我们就存入到n2中,以头插入方式,实现链表的反转。代码实现如下:
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode n1=head,n2=null;
while(head!=null){
head = head.next;
n1.next = n2;
n2=n1;
n1=head;
}
return n2;
}
}
思路二:利用递归
结合上一篇提到的递归思路,我们首先先对这个链表进行递归,我们走到深处获取其中最底层的元素,随着递归的回溯,我们可以得到链表的反转。
代码实现:
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
利用先调用递归,再执行函数,可以实现找到最底层元素,不断回溯,以图为例;
我们递归到最里层也就是head->5,此时返回5
也就是第四层 此时newHead=5
5->head,此时head为第四层,所以head=4
所以5->4,4->null
由这样的思路可以推下去。