题目:给到单链表的head
,请你反转链表,并返回最后的链表。
例如:[1,2,3,4,5]
[5,4,3,2,1]
题解:
根据@数据结构与算法 答案,分析解题思路。
public ListNode rev(ListNode head){
if(head == null || head.next == null){
return head;
}
ListNode next = head.next;
ListNode reverse = rev(next);
next.next = head;
head.next =null;
return reverse;
}
设传入的链表为1,2,3,4
这里面的难点就是对象引用的概念
比如这里 ListNode next = head.next
,next
指向的就是head.next
内存地址,当修改了next
之后就当相当于修改了head.next
.
next.next = head
head.next = null
就相当于
head.next.next = head
head.next = null
比如当前链表的head=1,head.next.next=3
,那么当前链表数据就是1,2,1,4
.经过head.next =null
之后1,null
.而reverse继承了之前的链表数据。
reverse = rev(next) //递归向下
在进入到最下层的时候,返回的链表4
。在第三次递归当中
next = 4;
reverse = 4;
next.next = head.//第三层的head =3
head.next = null.
这样一来,reverse = 4,reverse.next = 3
;并且,清空head.next
,将链表断开,否则将会产生无限循环的链表。
比如a.next-> b,b.next = a
.这样一直反复。
将head.next
冒泡到上一层的时候,设置为null
的next
,将有上一层的链表所赋值,继而next
继续为null
。以保最后一层链表的next
为null
。
记住几个变量的作用:
head 当前链表的位置
next head的下一位
reverse 倒叙新链表
解法2:通过stack先进后出的特性,将链表存在stack中,然后在取出。赋值到新的链表当中
public ListNode reverse(ListNode head){
Stack<ListNode> stack = new Stack<>();
while(head != null){
stack.push(head);
head = head.next;
}
if(stack.isEmpty()){
return null;
}
ListNode reverse = stack.pop();
ListNode curr = reverse;
while (!stack.isEmpty()){
ListNode temp = stack.pop();
curr.next = temp;
curr = curr.next;
}
curr.next = null;
return reverse;
}
解法3:
ListNode newList = null;
while(head != null){
//交换变量,临时存储
ListNode node = head.next;
//将新的链表的变量存储到head中。
head.next = newList;
//将链表当前的head截断,赋值到newlist中。
newList = head;
//head 进入下一层链表
head = node;
}
return newList;