一、链表反转的概念
首先说明一下什么是链表反转,如下图所示,给出一个A链表:a1,a2,a3。将它的结构变为如下B链表的样式:a3,a2,a1。这就是链表反转
二、链表反转的实现方式
这里总共介绍两种链表反转的实现方式
(1)使用虚拟节点(又名头盔法)
(2)直接操作链表来实现(又名穿针引线法)
方法1:虚拟节点法
如上图所示,对A节点遍历依次安置在虚拟节点的下一节点上。整个过程可以理解为链表的插入操作,被插入的链表是虚拟节点作为头指针作为头节点的链表,插入的链表就是A链表。所以首先就是学会链表的插入操作然后做这个就比较容易了。
代码:
public static ListNode reverseList(ListNode head){
ListNode dummyNode = new ListNode(-1);
ListNode curNode = head;
while (curNode != null){
ListNode temp = curNode.next;
curNode.next=dummyNode.next;
dummyNode.next=curNode;
curNode=temp;
}
return dummyNode.next;
}
方法二:直接操作链表实现
代码:
public static ListNode reverseList2(ListNode head){
ListNode pre = null;
ListNode cur = head;
while (cur!=null){
ListNode temp = cur.next;
cur.next =pre;
pre=cur;
cur=temp;
}
return pre;
}
这种方法不需要额外定义一个节点,遍历原链表,然后取出的每个节点的下一个节点指在pre节点上。