数据结构之单链表及单链表反转过程

1. 【栗子】:
public class Note {
    private int id;
    private Object date;
    public Note next;

    public Note(int no, Object date) {
        id = no;
        this.date = date;
    }

    @Override
    public String toString() {
        return "Note{" +
                "id=" + id +
                ", date=" + date +
                '}';
    }
}
public class NoteList {

    private Note head = new Note(0, "");

    public Note getHead() {
        return head;
    }

    //添加节点
    public void add(Note note) {
        Note temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = note;
    }

    //显示链表[遍历]
    public void list() {
        //判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        Note temp = head.next;
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }

    //将单链表反转
    public static void reversetList(Note head) {
        if (head.next == null || head.next.next == null) {
            return;
        }

        Note cur = head.next;
        Note next = null;// 指向当前节点[cur]的下一个节点
        Note reverseHead = new Note(0, "");
        while (cur != null) {
            next = cur.next;              //先暂时保存当前节点的下一个节点,因为后面需要使用
            cur.next = reverseHead.next;  //将cur的下一个节点指向新的链表的最前端
            reverseHead.next = cur;       //将cur 连接到新的链表上
            cur = next;                   //让cur后移
        }
        //将head.next 指向 reverseHead.next , 实现单链表的反转
        head.next = reverseHead.next;
    }


    public static void main(String[] args) {
        NoteList noteList = new NoteList();
        noteList.add(new Note(1, "note1"));
        noteList.add(new Note(2, "note2"));
        noteList.add(new Note(3, "note3"));
        noteList.add(new Note(4, "note4"));
        System.out.println("源数据");
        noteList.list();
        System.out.println("反转后:");
        reversetList(noteList.getHead());
        noteList.list();
    }
}

【输出结果】:

源数据
Note{id=1, date=note1}
Note{id=2, date=note2}
Note{id=3, date=note3}
Note{id=4, date=note4}
反转后:
Note{id=4, date=note4}
Note{id=3, date=note3}
Note{id=2, date=note2}
Note{id=1, date=note1}

2. 【过程详解】:

 【要点】:

从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead 的最前端.
取出,就是断开与下一节点的连接:

  原始数据:

在这里插入图片描述
 【第一次循环】:

Note cur = head.next;  //即cur指向note1
next = cur.next;    //即next指向note2,将note2的数据临时保存在next里
·
cur.next = reverseHead.next; //reverseHead.next为null,cur.next即note1.next,所以此语句断开原本note1.next指向的note2,改为null
reverseHead.next = cur;   //cur指向了note1,此语句则是reverseHead.next 的下一个节点为note1,也就是把note1插到reverseHead后面
cur = next;//让cur后移,即cur指向note2

在这里插入图片描述

 【第二轮循环】:

Note cur = head.next;  //即cur指向了note2
next = cur.next;    //即next指向note3,将note3的数据临时保存在next里
·
cur.next = reverseHead.next; //reverseHead.next为note1,cur.next即note2.next,所以此语句断开原本note2.next指向的note3,改为指向note1
reverseHead.next = cur;   //cur指向了note2,此语句则是reverseHead.next 的下一个节点为note2,也就是把note2插到reverseHead后面
cur = next;  //让cur后移,即cur指向note3

在这里插入图片描述

以此类推即可,以为上个人理解,欢迎讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值