剑指 Offer 24. 反转链表
题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
数据限制
0 <= 节点个数 <= 5000
思路
题目要求我们将链表反转,那么我们可以先设置一个指针 p 指向头指针,然后遍历一遍链表,每遍历到一个指针,就将该指针插入到p指针的后面,让他成为新的头指针,而之前的指针就会依次后移,等遍历完最后一个指针之后,链表就完成了反转
时间复杂度:O(n)
空间复杂度:O(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) {
if (head == null) return head;
ListNode p = new ListNode();
p.next = head; // p 指向头指针
head = head.next; // head 后移
p.next.next = null;
while (head != null){
ListNode temp = head; // 插入指针
head = head.next;
temp.next = p.next;
p.next = temp;
}
return p.next;
}
}