本文用两种方法实现链表的反转(LeetCode 206. Reverse Linked List):①利用next指针穿针引线;②递归算法。
题目:
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
方法一:利用ListNode的next指针穿针引线,原地反转。
分析:
head(cur)
1 -> 2 -> 3 -> 4 -> 5 -> NULL
从第一个节点开始,节点1的next指针指向NULL,实现了第一个节点的反转,反转以后链表变成:
cur
NULL <- 1 2 -> 3 -> 4 -> 5 -> NULL
这样的话第二个节点就找不到了,需要先保存一个第二个节点(节点1的下一个节点),所以要定义一个next节点来保存第二个节点。
cur next
1 -> 2 -> 3 -> 4 -> 5 -> NULL
cur的next指针指向NULL,cur和next后移:
cur next
NULL<- 1 2 -> 3 -> 4 -> 5 -> NULL
这样更新完之后又会丢失上一个节点,所以也需要一个定义一个pre指针来保存前一个节点。
pre cur next
NULL 1 -> 2 -> 3 -> 4 -> 5 -> NULL
接着cur节点next指针指向pre:
pre cur next
NULL <- 1 2 -> 3 -> 4 -> 5 -> NULL
向后移动,反转下个节点:
pre cur next
NULL <- 1 2 -> 3 -> 4 -> 5 -> NULL
执行重复操作,直到完成反转。代码如下:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}
方法二:递归算法实现反转。
终止条件:head为空或者只有head一个节点的时候,返回head。
递归实现:把链表看成两个“节点”,第一个节点是head,第二个节点是剩余部分,将这两个节点完成反转。
代码如下:
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next==null){
return head;
}
ListNode node = reverseList(head.next);
head.next.next = head;
head.next = null;
return node;
}
}