1.题目
有一个单向非循环链表,反转这个链表并输出。
2.代码
/**
* Describe:反转一个单向链表
* User:lenovo
* Date:2023-01-05
* Time:22:57
*/
class Node {
int val;
Node next;
public Node() {
}
public Node(int val) {
this.val = val;
}
}
class MyLinkedList {
public Node head;
public MyLinkedList(Node head) {
this.head = head;
}
public MyLinkedList() {
}
}
public class Test {
public static void reversal(MyLinkedList list){
Node s1 = list.head;
Node s2;
Node s3;
//链表为空
if(list.head == null) {
return;
}
//链表不为空
s2 = s1.next;
while(s2 != null) {
s3 = s2.next;
s2.next = s1;
s1 = s2;
s2 = s3;
}
list.head.next = null;
list.head = s1;
}
public static void main(String[] args) {
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
Node n5 = new Node(5);
Node n6 = new Node(1);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
MyLinkedList myLinkedList = new MyLinkedList(n1);
reversal(myLinkedList);
Node cur = myLinkedList.head;
while(cur != null) {
System.out.print(cur.val + " ");
cur = cur.next;
}
}
}
如果链表为空直接返回;
我们让s1为要调换元素的前一个元素,s2为要调换的元素,s3为要调换元素的下一个元素;
s2不为null,我们就调换它,记录它的下一个节点(s3=s2.next),然后开始调换,s2.next = s1,然后为下一步做准备,s1=s2,s2=s3。(如果第一步不记录s2的下一个节点丢失);
我们原来的头节点的next置为空,list.head.next=null;
改变头节点,此时s2=null,s1是原链表的尾节点,是现在链表的头节点,list.head = s1
3.总结
本题主要涉及三个节点,要调换节点的前一个节点,要交换的节点,要交换节点的后一个节点