问题描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路
迭代
- 迭代是从前向后遍历的过程,所以要新new 一个链表,把原有链表从前向后取值,再一个一个挂到新链表上,每次都要先把新链表存到当前元素的下一个位置上,再将新链表的头指向当前元素,这样就起到一个换位的作用。
递归
- List item
迭代实现
图示:https://blog.csdn.net/fx677588/article/details/72357389
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head ==null){
return null;
}
ListNode newList= null;
ListNode cur = head;
while (cur!=null){
ListNode curNext = cur.next;
cur.next=newList;//把原有链表的当前节点的next指向新链表已存在的部分
newList=cur;//把新链表头部指向当前元素,这样就达到了倒叙的效果
cur = curNext;
}
return newList;
}
}
递归实现
class Solution {
public ListNode reverseList(ListNode head) {
if(head ==null || head.next == null){
return head;
}
ListNode node = head.next;
head.next = null;
ListNode reverseRest = reverseList(node);
node.next = head;
return reverseRest;//返回的是第一次遍历结束后,第一出栈的5,随后出栈是不断给他的下一个元素赋值,不断的下一个,最终形成一个链表
}
开始是从头开始遍历,1进栈,2进栈,3进栈,4进栈,5进栈,然后5没有next,5出栈(即最后的返回值),5出栈之后,到4的调用栈,这时node=5,head=4,把node.next = head,即5的下一个为4,然后4出栈,到3的调用栈,node=4,head=3,赋值,即4的下一个值为3,然后到2的调用栈,node = 3,head=2,赋值,即3的下一个值为2,2出栈,然后到1的调用栈,node=2,head=1,赋值,即2的下一个值为1,1出栈,最后第一次出栈的5就为5,4,3,2,1的链表