import java.util.Scanner;
import java.util.Stack;
/**
*
* 反转链表、逆序遍历单链表(用栈解决)、查找单链表中倒数第k个节点
*
*/
public class ReverseLinkedList {
ReverseNode head=new ReverseNode(0,"","");
//统计当前链表的节点个数
public int nodeNumber(){
ReverseNode temp=head;
int count=0;
if(head.next==null){
return 0;
}
while(temp.next!=null){
count++;
temp=temp.next;
}
return count;
}
public void findLastKNode(int k){
ReverseNode temp=head;
if(head.next==null){
System.out.println("该链表为空!");
return;
}
if(k<0||k>nodeNumber()){
System.out.println("输入的数不合法或者大于链表长度!");
return;
}
for(int i=0;i<nodeNumber()-k;i++){
temp=temp.next;
}
System.out.println(temp.next);
}
//反转链表
public void reverseLinkedList(){
//创建一个新的头节点(头插法)
ReverseNode reverseNode=new ReverseNode(0,"","");
//定义两个指针,cur1表示当前正在插入的节点,cur2表示之后准备要插入的节点
ReverseNode cur1=head.next;
ReverseNode cur2=cur1;
if(head.next==null){
System.out.println("该链表为空!");
return;
}
while(cur2!=null){
cur2=cur2.next;
cur1.next=reverseNode.next;
reverseNode.next=cur1;
cur1=cur2;
}
head.next=reverseNode.next;
}
//逆序遍历单链表(栈)
public void lastTOBeginLinkedList(){
ReverseNode temp=head;
Stack<ReverseNode> stack=new Stack<>();
while(temp.next!=null){
stack.push(temp.next);
temp=temp.next;
}
while(stack.size()>0){
System.out.println(stack.pop());
}
}
//添加节点
public void addNode(ReverseNode node){
ReverseNode temp=head;
while(temp.next!=null){
temp=temp.next;
}
temp.next=node;
}
//显示链表
public void showReverseNode(){
ReverseNode temp=head.next;
if(head.next==null){
System.out.println("该链表为空!");
return;
}
while(temp!=null){
System.out.println(temp);
temp=temp.next;
}
}
public static void main(String[] args){
ReverseLinkedList reverseLinkedList=new ReverseLinkedList();
ReverseNode node1=new ReverseNode(2,"林冲","豹子头");
ReverseNode node2=new ReverseNode(8,"宋江","及时雨");
ReverseNode node3=new ReverseNode(4,"鲁智深","花和尚");
ReverseNode node4=new ReverseNode(1,"吴用","智多星");
ReverseNode node5=new ReverseNode(9,"吴用1","智多星1");
System.out.println("原链表如下:");
reverseLinkedList.addNode(node1);
reverseLinkedList.addNode(node2);
reverseLinkedList.addNode(node3);
reverseLinkedList.addNode(node4);
reverseLinkedList.addNode(node5);
reverseLinkedList.showReverseNode();
System.out.println("反转后的链表如下:");
reverseLinkedList.reverseLinkedList();
reverseLinkedList.showReverseNode();
System.out.println("逆序遍历后的链表如下:");
reverseLinkedList.lastTOBeginLinkedList();
Scanner s=new Scanner(System.in);
System.out.print("请输入要查找单链表中倒数第k个节点的序号:");
int x=s.nextInt();
reverseLinkedList.findLastKNode(x);
}
}
class ReverseNode{
public int no;
public String username;
public String rname;
ReverseNode next;
public ReverseNode(int no,String username,String rname){
this.no=no;
this.username=username;
this.rname=rname;
}
public String toString(){
return "no="+no+" "+"username="+username+" "+"rname="+rname;
}
}
反转链表、逆序遍历单链表(栈)、查找单链表中倒数第k个节点
最新推荐文章于 2024-04-24 16:09:08 发布