单向链表的反转

链表是线性表结构,需要的内存可以是不连续的,通过指针将内存联系到一起,这些内存就成为链表的结点,每个结点不但要存储该结点的数据,还要存储下一个结点的地址,记录下个结点地址的指针我们称为后继指针,在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));
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值