Class PHA.YX.Arithmetic.LinkedList.Node Extends %RegisteredObject
{
Property data As %Integer;
Property next As Node;
Method %OnNew(data As %Integer = "") As %Status [ Private, ServerOnly = 1 ]
{
s $this.data = data
Quit ?$OK
}
}
链表类
Class PHA.YX.Arithmetic.LinkedList Extends %RegisteredObject
{
/* 头节点指针 */
Property head As PHA.YX.Arithmetic.LinkedList.Node [ Private ];
/* 尾节点指针 */
Property last As PHA.YX.Arithmetic.LinkedList.Node [ Private ];
/* 链表实际长度,注意这个地方如果不初始化为0,会有意想不到到的错误,足足找了一个月 */
Property size As %Integer [ InitialExpression = 0, Private ];
Method insert(index As %Integer, data As %Integer)
{
/* 超出链表节点范围 */
i (index < 0)||(index > ..size) d
.throw ##class(PHA.COM.MOB.Exception).%New("超出链表节点范围!")
/* 初始化节点 */
#dim insertedNode as PHA.YX.Arithmetic.LinkedList.Node = ##class(PHA.YX.Arithmetic.LinkedList.Node).%New(data)
#dim prevNode as PHA.YX.Arithmetic.LinkedList.Node
/* 第一次插入 */
i (..size = 0) d
.s ..head = insertedNode
.s ..last = insertedNode
e i (index = 0) d /* 插入头部 */
.s insertedNode.next = ..head
.s ..head = insertedNode
e i (..size = index) d /* 插入尾部,这个地方一定要注意顺序 */
.s ..last.next = insertedNode
.s ..last = insertedNode
e d /* 插入中间 */
.s prevNode = ..get(index - 1)
.s insertedNode.next = prevNode.next
.s prevNode.next = insertedNode
/* 长度加一 */
s ..size = ..size +1
}
Method remove(index As %Integer) As PHA.YX.Arithmetic.LinkedList.Node
{
i (index < 0)||(index > ..size) d
.throw ##class(PHA.COM.MOB.Exception).%New("超出链表节点范围!")
#dim removedNode as PHA.YX.Arithmetic.LinkedList.Node
#dim prevNode as PHA.YX.Arithmetic.LinkedList.Node
#dim nextNode as PHA.YX.Arithmetic.LinkedList.Node
i (index = 0) d /* 删除头节点 */
.s removedNode = ..head
.s ..head = ..head.next
e i (index = (..size - 1) ) d /* 删除尾节点,表达式做加减乘除注意括号,否则有意想不到的错误 */
.s prevNode = ..get(index - 1)
.s removedNode = prevNode.next
.s prevNode.next = ""
.s ..last = prevNode
e d /* 删除中间节点 */
.s prevNode = ..get(index - 1)
.s nextNode = prevNode.next.next
.s removedNode = prevNode.next
.s prevNode.next = nextNode
/* 长度减一 */
s ..size = ..size - 1
q removedNode
}
Method get(index As %Integer) As PHA.YX.Arithmetic.LinkedList.Node
{
i (index < 0)||(index > ..size) d
.throw ##class(PHA.COM.MOB.Exception).%New("超出链表节点范围!")
/* 查找链表位置 */
#dim temp as PHA.YX.Arithmetic.LinkedList.Node = ..head
f i = 0 : 1 : index - 1 d
.s temp = temp.next
q temp
}
Method output()
{
#dim temp as PHA.YX.Arithmetic.LinkedList.Node = ..head
/* 输出链表 */
while(temp '= ""){
w temp.data,!
s temp = temp.next
}
}
}
调用
添加节点
/// w ##class(PHA.YX.Arithmetic).LinkedList()
ClassMethod LinkedList()
{
s $zt = "ErrLinkedList"
#dim linkedList as PHA.YX.Arithmetic.LinkedList = ##class(PHA.YX.Arithmetic.LinkedList).%New()
d linkedList.insert(0,3)
d linkedList.insert(0,4)
d linkedList.insert(2,9)
d linkedList.insert(3,5)
d linkedList.insert(1,6)
//d linkedList.remove(1)
d linkedList.output()
q ""
ErrLinkedList
q $ze
}