网站开发 数据库,贵州 网站建设,佛山市专注网站建设平台,制作手机端网站文章目录 链表的相关知识链表的创建:模拟方式建立链表的**递归创建** 链表的读取遍历读取递归读取 完整代码 链表的相关知识 链表有时会具有头节点#xff0c;头节点的指针指向第一个节点的地址#xff0c;其本身的数据域可以根据自己的选择进行赋值 接下来我将以将int转… 文章目录 链表的相关知识链表的创建:模拟方式建立链表的**递归创建** 链表的读取遍历读取递归读取 完整代码 链表的相关知识 链表有时会具有头节点头节点的指针指向第一个节点的地址其本身的数据域可以根据自己的选择进行赋值 接下来我将以将int转换为链表为例进行演示如果有什么地方可以改进也希望路过大神能够指出
链表的创建:
链表的结构定义一般如下即由本身的数据和指向下一个节点的指针构成
type ListNode struct {Val intNext *ListNode//不能直接赋值listnode避免产生嵌套引用
}链表的创建每个节点存储一位数字在创建的过程中 我们需要设置中间的可变节点不然我们可能会丢失对链表的第一个节点的索引以下的例子中我们就使用middle为中间节点将head设置为头节点并代表完整的链表
模拟方式建立 我们利用迭代的方法只要还存在num就更新创建一个新的节点
// 尝试建立有头节点的链表关键在于赋值给middle.next
func CreateList(nums int) *ListNode {Head : new(ListNode) //这代表一整个链表并通过这里的头节点进行标注方便该链表的引用middle : Head //middle视作Head链表的中间节点其一直改变for nums 0 {middle.Next ListNode{Val: nums % 10}//头节点赋值方法fmt.Printf(middle.Val: %v\n, middle.Val)middle middle.Nextnums / 10}return Head
}链表的递归创建
// 递归建立链表
func RecurCreateList(nums int) *ListNode {//在递归时好像不需要单独保存头节点位置后续的位置会递归存储在next中不用考虑被覆盖的问题middle : new(ListNode) //建立头指针其指针不变// 123%103// 12.3%102// 1.23%101// 120%100// 12 %102// 1.2%101if nums 1 || nums%10 0 {middle.Val nums % 10fmt.Printf(middle.Val: %v\n, middle.Val)if nums 1 {nums / 10middle.Next RecurCreateList(nums)}}return middle
}链表的读取
遍历读取 链表读取时我们需要根据是否具有头节点进行一定的调整下面是使用遍历迭代进行创建的过程
// 尝试遍历读取链表
func ReadList(L ListNode) {middle : L //将头节点赋予这里的中间节点middle//循环读取链表的内容for middle.Next ! nil {v : middle.Next.Val //由于我们这里判断的是本身节点是否为空所以在输出时使用下一节点的值进行输出避免错过某个值fmt.Printf(v: %v\n, v)// // fmt.Printf(L: %v\n, L)middle *middle.Next// // fmt.Printf(L: %v\n, L)}
}递归读取
下面为使用递归进行读取的方法 由于节点的定义过程中使用内嵌在建立相关函数时都使用指针比较方便[ 虽然前面都没注意:( ],
// 尝试递归读取链表
func RecurReadList(L *ListNode) {fmt.Printf(L.Val: %v\n, L.Val) //打印出此节点中的Val//如果本结点的指针不为空即还有下一个节点继续读取if L.Next ! nil {RecurReadList(L.Next) //将下个节点的指针传入}//如果运行到这里说明指针为空函数也就到此结束了
}
完整代码
package mainimport (fmt
)type ListNode struct {Val intNext *ListNode
}func main() {// l : CreateList(13)l : RecurCreateList(13)fmt.Printf(l: %v\n, *l)// ReadList(*l)RecurReadList(l)// RecurReadList(l.Next)// fmt.Println(l.Next.Val)
}// 尝试建立有头节点的链表关键在于赋值给middle.next
func CreateList(nums int) *ListNode {Head : new(ListNode) //这代表一整个链表并通过这里的头节点进行标注方便该链表的引用middle : Head //middle视作Head链表的中间节点其一直改变for nums 0 {middle.Next ListNode{Val: nums % 10} //头节点赋值方法fmt.Printf(middle.Val: %v\n, middle.Val)middle middle.Nextnums / 10}return Head
}// 递归建立链表
func RecurCreateList(nums int) *ListNode {//在递归时好像不需要单独保存头节点位置后续的位置会递归存储在next中不用考虑被覆盖的问题middle : new(ListNode) //建立头指针其指针不变// 123%103// 12.3%102// 1.23%101// 120%100// 12 %102// 1.2%101if nums 1 || nums%10 0 {middle.Val nums % 10fmt.Printf(middle.Val: %v\n, middle.Val)if nums 1 {nums / 10middle.Next RecurCreateList(nums)}}return middle
}// 尝试遍历读取链表
func ReadList(L ListNode) {middle : L //将头节点赋予这里的中间节点middle//循环读取链表的内容for middle.Next ! nil {v : middle.Next.Val //由于我们这里判断的是本身节点是否为空所以在输出时使用下一节点的值进行输出避免错过某个值fmt.Printf(v: %v\n, v)// // fmt.Printf(L: %v\n, L)middle *middle.Next// // fmt.Printf(L: %v\n, L)}
}// 尝试递归读取链表
func RecurReadList(L *ListNode) {fmt.Printf(L.Val: %v\n, L.Val) //打印出此节点中的Val//如果本结点的指针不为空即还有下一个节点继续读取if L.Next ! nil {RecurReadList(L.Next) //将下个节点的指针传入}//如果运行到这里说明指针为空函数也就到此结束了
}