问题:一个单链表将其反转
单链表是一种常见的数据结构,对于链表中的每一个结点都包含两部分:数据域和指针域。例如,有一个链表1—>2—>3—>4,反转后为4—>3—>2—>1。
解决:
1. 遍历反转法
2. 递归反转法
定义链表结点的实体类
代码:
public class Node {
private Object data;//单链表结点的数据域
private Node next;//单链表结点的指针域
public Node(Object data){
this.data = data;
}
public Node(Object data,Node next){
this.data = data;
this.next = next;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
1.遍历反转法
代码:
//遍历反转法
public static Node reverseListNode1(Node head){
if(head==null || head.getNext()==null){
return head;
}
Node preNode = null;//前一个结点的指针
Node curNode = head;//当前结点的指针
Node nextNode = null;//下一个结点的指针
while(curNode!=null){
nextNode = curNode.getNext();
curNode.setNext(preNode);
preNode = curNode;
curNode = nextNode;
}
return preNode;
}
分析(主要是分析while循环)
- 先用nextNode记住当前结点的下一个结点,即:nextNode = curNode.getNext();
- 将当前结点的指针域指向前驱结点,即:curNode.setNext(preNode);
- 前驱节点后移到当前结点,即:preNode = curNode;
- 当前结点后移到后继结点,即:curNode = nextNode;
2.递归反转法
代码:
//递归法反转链表
public static Node reverseListNode2(Node head){
if(head==null || head.getNext()==null){
return head;
}
Node nextNode = head.getNext();//获取当前结点head的下一个结点nextNode
Node newHead = reverseListNode2(nextNode);
nextNode.setNext(head);//将当前结点nextNode的指针域指向前驱结点head
head.setNext(null);
return newHead;
}
分析:
递归操作就是一个先递后归的过程,不断调用reverseListNode2(nextNode)不断向下传递就是为了获取新的头结点(即原链表的尾结点);向上归的过程每个结点将自己的指针域设置成前驱结点,即:nextNode.setNext(head),head.setNext(null)就是为了将原有的头结点,即反转后的尾结点的指针域指向null。虽然在每次归的过程中都会执行head.setNext(null);但第2次归会将第1次的覆盖,第3次会将第2次的覆盖掉,直到反转后的链表的尾部结点,尾部结点指向null。
测试代码:
public static void main(String[] args) {
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
node1.setNext(node2);
node2.setNext(node3);
node3.setNext(node4);
Node h = node1;
while(h!=null){
System.out.print(h.getData()+" ");
h = h.getNext();
}
System.out.println();
System.out.println("=============================");
Node head = reverseListNode1(node1);
while(head!=null){
System.out.print(head.getData()+" ");
head = head.getNext();
}
}
结果:
转载出处:
- https://blog.csdn.net/lwkrsa/article/details/82015364
- https://blog.csdn.net/qq_32534441/article/details/91872381