题目描述
输入一个链表,反转链表后,输出新链表的表头。
思路1:最开始的思路是使用栈
import java.util.Stack; public class Solution { public ListNode ReverseList(ListNode head) { if(head == null) return null; Stack<ListNode> stack=new Stack<ListNode>(); while (head!=null){ stack.push(head); head=head.next; } head = stack.pop(); //从栈再倒给链表 ListNode res = head; //先记录首个节点,再倒。如果本题不返回首个元素,可以直接倒 while (!stack.isEmpty()){ head.next = stack.pop(); head = head.next; } head.next = null; return res; } }
思路2:由于栈的使用需要额外的空间,第二个想法就是交换指针,让A指向B变成B指向A
其他大佬的图解和描述很详细。
A->B->C->null 变成 null<-A<-B<-C
public class Solution { public ListNode ReverseList(ListNode head) { if (head == null || head.next==null) return head; //初始情况head指向A ListNode pre = null;// 当前节点的前一个节点 也就是A翻转后要指向null ListNode post = head;// 当前节点的下一个节点 这里先指向A while(head!=null) { post = head.next;// 记录当前节点的下一个节点位置 下一位置是B,所以指B head.next = pre;// 让当前节点指向前一个节点位置,这一步完成由A指B变B指A pre = head;// pre 往右走, pre指向A,也就是B翻转后要指向A。B的前一节点 head = post;// 当前节点往右继续走 此时head由A变B,意味着完成一次翻转。 //初始是pre是null,head是A,post是A,此时pre是A,head是B,post是B。完成了A的反转 } return pre; } }
思路3:递归 (暂时没理解透彻)
public class Solution { public ListNode ReverseList(ListNode head) { if(head==null||head.next ==null) return head; ListNode next = head.next; ListNode prev = ReverseList(next); head.next.next = head; head.next = null; return prev; } }