1. 问题:
链表 head -->1-->2-->3-->4-->5-->6-->7, 如何反转为head -->7-->6->5-->4-->3-->2-->1,
2.思路(使用插入法)
思路:从链表的第二个节点开始,把遍历到的节点插入到头结点的后面,直到遍历结束。
假设原链表:head -->1-->2-->3-->4-->5-->6-->7,
在遍历2的时候,链表变为head -->2-->1-->3-->4-->5-->6-->7,
3.代码实现:
package LinkedList.Reverse;
/*
这里使用插入法进行反转链表
思路:从链表的第二个节点开始,把遍历到的节点插入到头结点的后面,直到遍历结束。
假设原链表:head -->1-->2-->3-->4-->5-->6-->7,
在遍历2的时候,链表变为head -->2-->1-->3-->4-->5-->6-->7,
*/
public class Reverse {
public static void main(String[] args) {
//定义头结点
LNode head=new LNode();
head.next=null;
LNode temp=null;
LNode cur=head;
//构造链表
for (int i = 1; i < 8; i++) {
temp=new LNode(); //定义一个辅助节点
temp.data=i; //temp数据为I
temp.next=null;
cur.next=temp; //头结点的下一个节点为temp
cur=temp; //cur后移 由head移动到temp
}
System.out.println("逆序前:");
for (cur=head.next;cur!=null;cur=cur.next){
System.out.println(cur.data+" ");
}
System.out.println("逆序后:");
Reverse(head);
for (cur=head.next;cur!=null;cur=cur.next){
System.out.println(cur.data+" ");
}
}
public static void Reverse(LNode head){
if (head==null || head.next==null){//如果头结点为空,或者头结点的下一个节点为空,链表不用反转
return;
}
LNode cur=null;//定义一个当前节点
LNode next=null;//定义一个后继节点
//让当前节点指向第二个节点
cur=head.next.next;
//先把第一个节点设置成最后一个节点
head.next.next=null;
while (cur!=null){//如果当前节点不为空
next=cur.next;//先保存当前节点的后继节点 如 2 的后面一个节点3 先保存起来
cur.next=head.next;// 就是把2 的下一个节点指向1
head.next=cur;//把头结点指向2
cur=next; //将当前节点指向下一个 3
}
}
}
class LNode{
LNode next;
int data;
}
使用递归法
//使用递归法
private static LNode RecursiveReverse(LNode head){
//如果链表为空或者链表只有一个元素
if (head==null || head.next==null){
return head;
}else {
//反转后面的节点
LNode newHead = RecursiveReverse(head.next);
//把前面遍历的节点加到后面节点逆序后链表的尾部
head.next.next=head;
head.next=null;
return newHead;
}
}
public static void Reverse(LNode head){
if (head==null){
return;
}
//获取链表的第一个节点
LNode firstNode=head.next;
//对链表进行逆序
LNode newhead = RecursiveReverse(firstNode);
head.next=newhead;
}