反转链表
反转链表
http://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca
第一种:递归法
解释一下:
经过head.next.next=head;使得head.next的next指针指向head
经过head.next=null;使得head的next指针指向空
所以这两句语句的作用就是使head与head->next的指向反转。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
//递归实现
if(head==null||head.next==null){//链表为空或者只有一个元素
return head;
}
//先反转后面的链表,走到链表的末端结点
ListNode p = ReverseList(head.next);
//再将当前节点设置为后面节点的后续节点
head.next.next=head;
head.next=null;
return p;
}
} 第二种:头插法
解释:这里涉及到head,pre,next三个结点
作用:使原本指向为head->(head->next)变为(head->next)->head
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){//该链表无结点或只有一个结点
return head;
}
ListNode pre = null;
ListNode next = null;
while(head!=null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
} 第三种:遍历+栈保存
最后,附上测试代码,只需改动ReverseList函数的内容,其他无需改动
class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
class Solution {
public static ListNode ReverseList(ListNode head) {
//递归实现
if(head==null||head.next==null){//链表为空或者只有一个元素
return head;
}
//先反转后面的链表,走到链表的末端结点
ListNode p = ReverseList(head.next);
//再将当前节点设置为后面节点的后续节点
head.next.next=head;
head.next=null;
return p;
}
public static void Myprint(ListNode t1)
{
while(t1!=null){
System.out.println(t1.val);
t1=t1.next;
}
}
public static void main(String[] args) {
ListNode t1 = new ListNode(1);
ListNode t2 = new ListNode(2);
ListNode t3 = new ListNode(3);
t1.next=t2;
t2.next=t3;
t3.next=null;
Myprint(t1);
System.out.println("--------反转之后的链表-------");
ListNode r = ReverseList(t1);
Myprint(r);
}
} 