23.反转链表
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
思考题:
- 请同时实现迭代版本和递归版本。
数据范围:
链表长度 [0,30]。
样例:
输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL
代码:
1.迭代版本
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//初始化前驱节点为null
ListNode p = null;
//遍历链表直到当前节点为null(到达链表尾部)
while(head!=null){
//临时保留当前节点的下一个节点
//避免修改当前节点的next指针后丢失后续链表
ListNode q = head.next;
//将当前节点的next指向前驱节点
head.next = p;
//当前节点称为新的前驱节点
p = head;
//当前节点后移,处理下一个节点
head = q;
}
//返回新的头节点,原链表的尾节点
return p;
}
}
2.递归版本
/**
* 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);
//将当前节点的下一个节点的next指向当前节点
head.next.next = head;
//断开原有指向
head.next = null;
return newHead;
}
}

浙公网安备 33010602011771号