方法一:直接改next指针 原链表:1->2->3->4->
class solution{
public ListNode reverseList(ListNode head){
if(head==null||head.next==null) return head;
ListNode p=head.next;
ListNode r=new ListNode();
head.next=null;//逆转后的head变成最后一个节点,所以head.next=null;
while(p!=null){
r=p.next; //结点r用来标记还没有改变的后续结点的第一个节点
p.next=head; //反转next指针
head=p; //反转处理后的链表的第一个节点
p=r;
}
return head;
}
}
class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int val){this.val=val;}
ListNode(int val,ListNode next){this.val=val;this.next=next;}
}
方法二:头插法
新建一个头节点newhead,让它指向head。head.next=null;
class solution{
public ListNode reverseList(ListNode head){
if(head==null||head.next==null) return head;
ListNode newhead=new ListNode();
newhead.next=head;
ListNode p=newhead.next.next;
head.next=null;
ListNode r=new ListNode();
while(p!=null){
r=p.next;
p.next=head.next;
head.next=p;
p=r;
}
return newhead.next;
}
}
补充情况:对于本身含有头节点的单链表的逆转 原链表 head->1->2->3->4->
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode p=head.next.next;
ListNode r=new ListNode();
head.next.next=null;
while(p!=null){
r=p.next;
p.next=head.next;
head.next=p;
p=r;
}
return head;
}
}