单向链表的反转
程序员文章站
2022-07-13 17:48:06
...
链表是线性表结构,需要的内存可以是不连续的,通过指针将内存联系到一起,这些内存就成为链表的结点,每个结点不但要存储该结点的数据,还要存储下一个结点的地址,记录下个结点地址的指针我们称为后继指针,在java中称之为引用。‘
比较常见的面试题是用java代码实现链表反转,实现反转的要领:比如现在有一个链表是4个结点组成。这个链表我们称之为A链表,反转后的链表我们称之为是B链表。
我们要把第三个结点复制到第四个节点之后,就是 p3 —>next—>next =p3。然后把p3结点的next 指向null.即p3—>next =null. 此时 就存在了两条链表A链表(3个结点p1—>p2—>p3)和B链表(2个结点p4->p3)。此时结构如下(方便理解,这样画的图)
理解了上面的内容,看一下代码实现。
1:递归和遍历二种的方法实现
package com.example.demo.数据结构;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.Setter;
import org.junit.Test;
/**
* @author
* @date
* @description 链表反转
*/
public class RevertLink {
@Getter
@Setter
class Node{
private Integer data; //当前结点的数据
private Node next; //下一个结点
}
//准备基础数据
Node readyNode(){
Node linkNode1 = new Node();
linkNode1.setData(1);
Node linkNode2 = new Node();
linkNode2.setData(2);
Node linkNode3 = new Node();
linkNode3.setData(3);
Node linkNode4 = new Node();
linkNode4.setData(4);
Node linkNode5 = new Node();
linkNode5.setData(5);
Node linkNode6 = new Node();
linkNode6.setData(6);
Node linkNode7 = new Node();
linkNode7.setData(7);
linkNode1.setNext(linkNode2);
linkNode2.setNext(linkNode3);
linkNode3.setNext(linkNode4);
linkNode4.setNext(linkNode5);
linkNode5.setNext(linkNode6);
linkNode6.setNext(linkNode7);
return linkNode1;
}
//递归方式链表反转
Node revert(Node head){
if (head == null || head.next == null){
return head;
} else {
Node revert = revert(head.next);
head.next.next = head;
head.next = null;
return revert;
}
}
/*遍历法反转单链表 */
Node reverseLinkedList(Node head){
Node previousNode = null;
Node currentNode = head;
Node headNode = null;
while (currentNode != null){
Node next = currentNode.next;
if (next == null) {
headNode = currentNode;
}
currentNode.next = previousNode;
previousNode = currentNode;
currentNode = next;
}
return headNode;
}
@Test
public void run2(){
Node node = readyNode();
Node revert = revert(node);
System.out.println(JSONObject.toJSONString(revert));
System.out.println(JSONObject.toJSONString(node));
}
}