解题思路
方法一:迭代(重复某一种从操作)
实现链表反转,可以设置两个指针,一个指向当前节点设为curr ,另一个指向当前节点的前一个节点设为prev ,可以使当前节点的next指向前一个节点,即curr.next = prev,由于当前节点没有引用上一个节点,所以要先存储前一个节点prev,还需要另一个指针来存储下一个节点,即ListNode next=curr.next,最后返回前节点prev。
代码如下
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextp = curr.next;
curr.next = prev;
prev = curr;
curr = nextp;
}
return prev;
}
方法二(递归自己调自己)
假设列表的其余部分已经被反转,现在我该如何反转它前面的部分?
假设列表为:n1→…→nk−1→nk→nk+1→…→nm →∅
若从节点 n k+1 到nm已经被反转,而我们正处于nk
希望 nk+1 的下一个节点指向nk,即nk.next.next=nk,
n1的前一个节点要指向空,即n1.next=null;
代码如下
/**
* 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 ||head.next==null) return head;
ListNode newhead = reverseList(head.next);
head.next.next=head;
head.next=null;
return newhead;
}
}
参考Leetcode官网解题+自己理解