为了方便编写,我这里用 kotlin 实现
定义结点结构
data class Node(
/**
* 携带内容
*/
val label:String = "",
/**
* 指向的下一个结点
*/
var next:Node?=null
)
创建单链表方法
private fun buildNodeLink(nodeHead: Node?) {
println("====================buildNodeLink======================")
var p:Node? = nodeHead
for (idx in 0 until 10) {
val newNode = Node(label = "Item ${idx + 1}")
p?.next = newNode
p = newNode
}
}
遍历打印单链表
用于检验结果
private fun printNodeLink(nodeHead:Node?) {
println("====================printNodeLink======================")
var p:Node? = nodeHead
while (true) {
if (p == null) break
println(p.label)
p = p.next
}
}
单链表逆序算法
private fun reverseNodeLink(nodeHead: Node?):Node? {
println("====================reverseNodeLink======================")
val p:Node? = nodeHead
var pre:Node? = p // 前结点
var mid:Node? = p?.next // 中间结点
var next:Node? = p?.next?.next // 后结点
pre?.next = null // 第一个结点 next 指向 null
while (true) {
mid?.next = pre // 中间结点 next 指向 前结点
pre = mid // 前结点 指向 中间结点
mid = next // 中间结点 指向 后结点
next = next?.next // 后结点 往后走
if (mid == null) {
break
}
}
return pre
}
开始测试
@Test
fun singleLinkReverse() {
var nodeHead:Node? = Node(label = "Head")
// 构建单链表
buildNodeLink(nodeHead)
// 遍历打印单链表
printNodeLink(nodeHead)
// 逆转单链表
nodeHead = reverseNodeLink(nodeHead)
// 遍历打印单链表
printNodeLink(nodeHead)
}
打印结果
====================buildNodeLink======================
====================printNodeLink======================
Head
Item 1
Item 2
Item 3
Item 4
Item 5
Item 6
Item 7
Item 8
Item 9
Item 10
====================reverseNodeLink======================
====================printNodeLink======================
Item 10
Item 9
Item 8
Item 7
Item 6
Item 5
Item 4
Item 3
Item 2
Item 1
Head