为什么在数组转链表的for循环中要使用head变量,而非直接用linkedlist?
问题:链表数组转换函数中为何要引入head变量遍历?
以下是Python链表实现代码:
class Node: def __init__(self, data): self.data = data self.ref = None def Print_LL(linkedlist): if linkedlist is None: print("LinkedList is empty!!") else: while linkedlist is not None: print(linkedlist.data) linkedlist = linkedlist.ref def arr_to_LL(arr, n): linkedlist = None for i in range(0,n): new_node = Node(arr[i]) if linkedlist is None: linkedlist = new_node else: head = linkedlist while head.ref is not None: head = head.ref head.ref = new_node return linkedlist
提问:在arr_to_LL函数的for循环内,为何需要引入head变量进行遍历操作,而不能直接使用linkedlist变量完成?
解答
核心原因是**linkedlist变量需要始终保留链表头节点的引用**,绝对不能通过遍历修改它的指向。
如果直接用linkedlist做遍历操作,会出现以下问题:
- 第一次添加节点时,
linkedlist指向头节点没问题; - 第二次添加节点时,你需要遍历到链表尾部,这时候执行
linkedlist = linkedlist.ref后,linkedlist会逐步移动到链表的最后一个节点,不再指向头; - 后续添加新节点时,你只能从当前的
linkedlist(也就是之前的尾部)开始操作,同时函数最终返回的linkedlist会变成最后一个节点,导致整个链表的头节点丢失,再也无法访问前面的所有节点。
而引入head变量的作用,就是让它代替linkedlist去做遍历:
head从linkedlist(头节点)出发,遍历找到链表尾部后添加新节点;- 整个过程中
linkedlist的指向完全不变,始终牢牢指向链表的头; - 函数最后返回
linkedlist时,依然是完整链表的头节点,能正常访问所有节点。
举个实际例子:假设转换的数组是[1,2,3],如果直接用linkedlist遍历,添加完1后,遍历找尾部时linkedlist会移到1;添加2后再次遍历,linkedlist移到2;最终返回的linkedlist是3,调用Print_LL时只能打印出3,前面的1和2都彻底丢失了。
内容的提问来源于stack exchange,提问作者user14829429
相关产品推荐
相关产品推荐

