题目描述:
给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。
数据范围:n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
解法:指针原地反转
思路:
首先定义三个指针,其作用如下:
(1)slow:指向 fast 的前一节点,用来保存反转后的链表。
(2)fast:指向当前需要反转的节点,从链表的头节点开始
(3)temp:指向 fast 的下一节点,用来保存未反转的链表。
每一次的反转,由 temp 指向 fast 的下一节点,然后将 fast 的 next 指向 slow,然后 slow 指向 fast ,fast 指向 temp,直到链表被遍历结束,返回slow即可。如下:
代码如下:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
//如果链表为空或者链表只有一个节点,直接返回head
if(head == null || head.next == null){
return head;
}
//slow:慢指针;fast:快指针;temp:指向fast的下一个节点
ListNode slow = null, fast = head, temp = null;
while(fast != null){
temp = fast.next;
fast.next = slow;
slow = fast;
fast = temp;
}
return slow;
}
}