反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
迭代:头插法,新定义一个新头节点newhead初始为空,每次往前移动一个位置到节点X,将该节点断开单独拿出来,将新节点连接到X后面 X->newhead,然后将newhead指向X作为新头节点。重复以上步骤直到节点为空。
/**
* 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 head;}
ListNode p=head.next;
head.next=null;
ListNode q=null,t=null;
while(p!=null){
t=p.next;
p.next=head;
head=p;
p=t;
}
return head;
}
}
递归:个人感觉递归就是将链表逆向处理,递归到尾部,从尾部节点往前处理,只要将节点next指向逆转,就能刚好逆转链表
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverse(ListNode head){
//递归逆转链表处理
if(head.next==null) return head;
//head是当前节点,p是下一个节点
ListNode p = reverse(head.next);
//直接将下一个节点的next指向当前节点,逆转过来
head.next=null;
p.next=head;
return head;
}
public ListNode reverseList(ListNode head) {
//先拿到最后一个节点作为逆转链表之后的头部
if(head==null) return head;
ListNode p=head,q=head.next;
while(q!=null){
p=q;
q=q.next;
}
//递归逆转
reverse(head);
return p;
}
}