Java单链表反转

data域:存储数据元素信息的域称为数据域; 
next域:存储直接后继位置的域称为指针域,它是存放结点的直接后继的地址(位置)的指针域(链域)。
data域+ next域:组成数据ai的存储映射,称为结点

Java代码如下

class Node{
    private int data;

    private Node next;

    public Node(int data){
        this.data = data;
    }

    public Node(int data,Node next){
        this.data = data;
        this.next = next;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}

遍历反转法: 基本思路是:将当前节点cur的下一个节点 cur.getNext()缓存到temp后,然后更改当前节点指针指向上一结点pre。也就是说在反转当前结点指针指向前,先把当前结点的指针域用tmp临时保存,以便下一次使用,其过程可表示如下:
pre:上一结点
cur: 当前结点
tmp: 临时结点,用于保存当前结点的指针域(即下一结点)

代码如下:

public class Test {

    public static Node reverse(Node node){
        if(null==node){
            return node;
        }
        Node preNode = node;                //当前节点指针 向前移动一个位置
        Node currentNode = node.getNext();  //原有下个节点的指针位置 移动到当前节点
        Node tempNode = null;               //临时结点,用于保存当前结点的指针域(即下一结点)

        while(null!=currentNode){
            tempNode = currentNode.getNext();// 指向下一个节点
            currentNode.setNext(preNode);    // 反转指针域的指向
            preNode = currentNode;           // preNode 指针往下移动
            currentNode = tempNode;          // curNode指针向后移动
        }
        node.setNext(null); //最后将原链表的头节点的指针域置为null,还回新链表的头结点,即原链表的尾结点
        return preNode;
    }


    public static void main(String[] args) {
        Node n1 = new Node(3);
        Node n2 = new Node(2);
        Node n3 = new Node(1);
        n1.setNext(n2);
        n2.setNext(n3);

        Node node = n1;
        while(null!=node){
            System.out.print(node.getData());
            node = node.getNext();
        }
        System.out.println("\n------反转------");
        Node temp = reverse(n1);
        while(null!=temp){
            System.out.print(temp.getData());
            temp = temp.getNext();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值