定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
方法一:迭代(双指针)
curd表示需要指向末端的节点,也就是pre
pre一开始指向null,也就是第一个节点要指向空,第二个节点要指向第一个节点,第三个指向第二个…
tmp则暂存当前要改变指向节点的下一个节点,方便后续节点重复操作。
一次操作后
ListNode tmp = curd.next;
curd.next = pre;
,将pre往下走也就是=curd,curd则再往前走,变成原来curd.next也就是tmp。
pre = curd;
curd = tmp;
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null, curd = head;
while(curd != null){
ListNode tmp = curd.next;
curd.next = pre;
pre = curd;
curd = tmp;
}
return pre;
}
}
方法二:递归
class Solution {
public ListNode reverseList(ListNode head) {
return recur(head,null);
}
private ListNode recur(ListNode curd,ListNode pre){
if(curd == null) return pre;
ListNode res = recur(curd.next,curd);
curd.next = pre;
return res;
}
}