1. 数据结构和算法(三)图解单向链表反转
所谓的单链表反转,就是把每个节点的指针域由原来的指向下一个节点变为指向其前一个节点。
一直觉得反转链表实现代码不是很好理解,今天用画图的方式去理解它。
1.1 需求分析
-
反转链表需求:
- 输入:[HBase,Redis,Kafka]
- 输出:[Kafka,Redis,HBase]
-
分析:
存在链表 HBase → Redis → Kafka → N,我们想要把它改成 N ← Kafka ← Redis ← HBase。
先说下思路:由于单链表没有指向前一个节点的指针域,因此我们需要增加一个指向前一个节点的指针prevNode,用于存储每一个节点的前一个节点。此外,还需要定义一个保存当前节点的指针currentNode,以及下一个节点的nextNode。定义好这三个指针后,遍历单链表,将当前节点的指针域指向前一个节点,之后将定义三个指针往后移动,直至遍历到最后一个节点停止。
链表反转代码的实现:
public CustomLinkedList reverse() {
Node<E> currentNode = this.first; // #1
Node<E> prevNode = new Node<E>(); // #2
while (currentNode != null) {
// #3
Node<E> nextNode = currentNode.next; // #4
currentNode.next = prevNode.next; // #5
prevNode.next = currentNode; // #6
currentNode = nextNode; // #7
}
CustomLinkedList customLinkedList = new CustomLinkedList(); //#8
customLinkedList.first = prevNode.next; //#9
customLinkedList