反转链表
(牛客网—牛客题霸算法篇—NC78)
题目描述
给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。
数据范围: n\leq1000n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
思路
Java实现
定义tail节点指向链表尾部,定义一个新的节点rehead作为反转链表的头节点,令rehead=tail,再定义一个移动节点h,用于寻找tail的前一个节点。
准备工作完成后,循环将tail指向tail的前一个节点。
代码实现
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode rehead=new ListNode(0);
//ListNode retail=head;
ListNode h=head;
ListNode tail=head;
if(head==null){
return head;
}else{
while(tail.next!=null){
tail=tail.next;
}
rehead=tail;
while(true){
if(head==tail){
break;
}
h=head;
while(h.next!=tail){
h=h.next;
}
tail.next=h;
h.next=null;
tail=h;
}
}
return rehead;
}
}