单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(next域),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
实现单链表的反转,即:
反转后为:
思路如下:
1.先定义一个节点reverseHead
2.从头到尾遍历原来的链表,每遍历一个节点就将其取出,并放在新链表reverseHead的最前端
3.原来链表的head.next=reverseHead.next
图解如下:
代码实现:
public void reversetList(Node head){
if(head.next==null ||head.next.next==null){
return ;
}
//定义一个指针,帮助我们遍历原来的链表
Node cur=head.next;
//指向当前节点【cur】的下一个节点
Node next =null;
Node reverseHead = new Node(0,"","");
//遍历原来的数组,每遍历一个,放在reverseHead的最前端
while(cur!=null){
next=cur.next;//保存当前节点的下一个节点
cur.next=reverseHead.next;//将cur的下一个节点指向新的链表的最前端
reverseHead.next=cur; //将cur链接到新的链表上
cur=next;//cur后移
}
//将head.next指向reverseHead.next,实现链表反转
head.next=reverseHead.next;
}
效果图如下:
还可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈先进后出的特点,实现反转打印
代码如下:
public void reversePrint(Node head){
if(head.next==null){
return ; //空链表
}
//创建一个栈,将各个节点压入栈
Stack<Node> stack=new Stack<>();
Node cur=head.next;
//将链表的所有节点压入栈
while(cur!=null){
stack.push(cur);
cur=cur.next;//cur后移,压入下一个节点
}
//将栈中节点打印,出栈
while(stack.size()>0){
System.out.println(stack.pop());
}
}
效果图如下: