定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
思路:方法一:递归。链表不断向后递归,直到递归至尾节点,改变链表指针的方向。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
return recur(head, null);
}
public ListNode recur(ListNode cur, ListNode pre){
if (cur == null) return pre; //递归结束条件
ListNode res = recur(cur.next, cur); //res为反转后链表的头节点
cur.next = pre;
return res;
}
}
方法二:双指针。pre指针指向null,cur指针指向头节点head,当cur不为空时,两个指针一起移动。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null, cur = head;
while (cur != null){
ListNode tmp = cur.next; //保存cur的下一个节点
cur.next = pre; //改变cur的指向
pre = cur; //pre和cur两个指针一起移动
cur = tmp;
}
return pre;
}
}