剑指offer24:反转链表
1、题目
剑指offer24:反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
2、代码
2.1、方案1:迭代(双指针)
原链表为 1->2->3->4->5->NULL,通过迭代将链表反转为NULL⬅1⬅2⬅3⬅4⬅5。
cur依次指向1,2,3,4,5,Null,pre依次指向NULL,1,2,3,4,5
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public static ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode pre = null;
ListNode temp;
while (cur !=null){
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
2.2、方案2:递归(先传递再回溯)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public static ListNode reverseList(ListNode head) {
return recur(head,null);
}
public static ListNode recur(ListNode cur,ListNode pre){
if(cur == null) return pre;//传递的终止条件
ListNode res = recur(cur.next,cur);//记录子函数返回的反转链表,并在此基础上进行修改
cur.next= pre;//修改pre和cur节点的指向
return res;//反转链表,除了最外层函数返回普通单链表,内层函数都返回循环单链表
}
}
3、随笔
3.1、测试代码
public static void main(String[] args) {
ListNode head = new ListNode(1);
ListNode firstNode = new ListNode(2);
ListNode secondNode = new ListNode(3);
ListNode thirdNode = new ListNode(4);
ListNode fourthNode = new ListNode(5);
head.next = firstNode;
firstNode.next = secondNode;
secondNode.next = thirdNode;
thirdNode.next = fourthNode;
fourthNode.next = null;
ListNode reversedList = reverseList(head);
System.out.println("reversedList.val = " + reversedList.val);
}