欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单向链表的反转

程序员文章站 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));
}
}