提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本篇文章分享了反转列表的两种简单方法
一、带虚拟头结点的链表反转
建立链表通常有两种方法,一种头插法,一种尾插法。
头插法,顾名思义,就是不断新加入的元素放在头部,如下图图所示。
由上图可以得知,头插法建立的链表与传入数据的顺序相反。我们正可以借助这个方法来实现链表的反转。循环原列表,获取元素,使用头插法建立新链表,最终实现链表反转。如下图所示:
代码如下所示
public ListNode reverseList(ListNode head) {
ListNode newnode =new ListNode(-1);
ListNode temp=head,next = head;
while(temp!=null){
//画个图想明白,每个链,如何断裂,如何连接
next=temp.next;
temp.next=newnode.next;
newnode.next=temp;
temp=next;
}
return newnode.next;
}
二、不带虚拟头结点的链表反转
不断向尾部插入元素,这时我们需要三个指针来操作,一个指针记录新链表的尾部元素,一个指针记录要插入的元素,一个指针记录原列表的头部元素
代码如下所示
ListNode pre=null,cur=head,next=null;
while(cur!=null){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
三、使用递归完成链表反转
public ListNode reverseList(ListNode head) {
if (head==null||head.next==null){
return head;
}
ListNode node = reverseList(head.next);
head.next.next=head;
head.next=null;
return node;
}