题目描述
输入一个链表,反转链表后,输出新链表的表头。
思路
(1)方法一:定义三个指针,边右移,边翻转
①若链表为空,或者链表只有一个结点直接返回head
②定义三个指针prev,cur,post,分别指向null,头结点head,以及head.next
③在head不为null时,改变链表的指向,cur->prev,然后将三个指针整体后移,(post用于标记下一个结点)
④在循环结束时,最后一个结点与前面的结点没有连接,将他们连接以后,返回cur即可
(2)方法二:头插法
①若链表为空,或者链表只有一个结点直接返回head
②在链表未达到末尾时,先从原链表中的去掉第一个结点,再将p标识的结点插入到新链表
③最后返回newhead即可
代码
/*
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 prev = null;
ListNode cur = head;
ListNode post = head.next;
while(post!=null){
cur.next = prev;
prev = cur;
cur = post;
post = post.next;
}
cur.next = prev;
return cur;
}
//方法二
public ListNode ReverseList2(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newhead = null;
while(head != null){
ListNode p = head;
head = head.next;
p.next = newhead;
newhead = p;
}
return newhead;
}
}