大语言模型无法理解链表 Large Language Models Fails to Understand Chained Table[up to 202407017]
大模型可以翻转链表,但是只能翻转单个元素链表。一但牵扯到分组操作,就不会了。
Case:
以K个元素为一组位翻转链表,每一组内部元素顺序不变。
Reverse the chained table in group of K elements, don't change the order in each group.
Hand written:
1 class Node():
2 def __init__(self, v=0, nxt = None) -> None:
3 self.value = v
4 self.nxt = nxt
5 def __str__(self) -> str:
6 return str(self.value)
7
8 class chain():
9 def __init__(self, h=None,l=0) -> None:
10 self.head = h
11 self.len = l
12
13 def insert(self,v):
14
15 self.len+=1
16 n = self.head
17 if self.head is None:
18 self.head = Node(v)
19 else:
20 while n.nxt is not None:
21 n = n.nxt
22 n.nxt = Node(v)
23 def __str__(self):
24 n = self.head
25 res = []
26 while n is not None:
27 res.append(n.value)
28 n = n.nxt
29
30 return ",".join([str(_) for _ in res])
31
32
33 def reverse_(self,k):
34
35 if self.len < k:
36 return
37 prev = None
38
39 stay = self.head
40 cur = self.head
41 # stay
42 # cur
43 # nxt
44 # 1 2 3 4 5 6 7
45 while cur is not None:
46
47 nxt = cur.nxt
48 ct = k
49 print(cur)
50 while ct-1 >0:
51 ct-=1
52 if nxt is not None:
53 cur = nxt
54 nxt = nxt.nxt
55
56 else:
57 break
58
59 print("connect", cur, "to", prev)
60 cur.nxt = prev
61 prev = stay
62
63 stay = nxt
64 cur = nxt
65 self.head = prev
66
67
68 c = chain()
69 c.insert(1)
70 c.insert(2)
71 c.insert(3)
72 c.insert(4)
73 c.insert(5)
74 c.insert(6)
75 c.insert(7)
76 c.reverse_(3)
77 print(c)
Result:
1
connect 3 to None
4
connect 6 to 1
7
connect 7 to 4
7,4,5,6,1,2,3
Chatgpt:
要实现按
𝑘
k 个元素一组逆转一个链表的功能,可以使用以下步骤和代码。这个问题的核心思想是遍历链表并在每
𝑘
k 个元素的地方进行逆转。以下是详细的步骤和相应的代码实现:
步骤
初始化和边界检查:首先检查链表是否为空或
𝑘
k 是否为无效值(如
𝑘
≤
1
k≤1),如果是,直接返回链表。
计算链表长度:遍历链表来计算其长度,这有助于判断是否还有足够的元素来进行下一次逆转。
逆转链表部分:
在每
𝑘
k 个节点处进行逆转。
使用三个指针来逆转链表部分:prev,curr,和 next。
逆转后将子链表重新连接到主链表中。
调整指针继续下一个子链表的处理。
代码实现(Python)
以下是按
𝑘
k 个元素一组逆转链表的 Python 实现:
python
复制代码
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverseKGroup(head, k):
# 辅助函数:逆转链表部分
def reverse(start, end):
prev, curr = None, start
while curr != end:
next_temp = curr.next
curr.next = prev
prev = curr
curr = next_temp
return prev
# 辅助函数:获取链表长度
def get_length(node):
length = 0
while node:
length += 1
node = node.next
return length
# 边界检查
if head is None or k <= 1:
return head
length = get_length(head)
dummy = ListNode(0)
dummy.next = head
prev = dummy
while length >= k:
start = prev.next
end = start
for _ in range(k):
end = end.next
# 逆转链表部分
new_start = reverse(start, end)
prev.next = new_start
start.next = end
prev = start
length -= k
return dummy.next
# 辅助函数:打印链表
def print_list(node):
while node:
print(node.val, end=" -> ")
node = node.next
print("None")
# 示例链表构建
nodes = [ListNode(i) for i in range(1, 9)]
for i in range(len(nodes) - 1):
nodes[i].next = nodes[i + 1]
head = nodes[0]
k = 3
# 逆转链表
new_head = reverseKGroup(head, k)
# 打印逆转后的链表
print_list(new_head)
解释
辅助函数reverse(start, end):用于逆转从 start 到 end 的链表部分。
辅助函数get_length(node):计算链表的长度。
主要逻辑reverseKGroup(head, k):
创建一个哨兵节点 dummy,使得操作更简便。
遍历链表并在每
𝑘
k 个节点处调用 reverse 函数进行逆转。
更新指针以准备处理下一段链表。
这个代码实现通过按
𝑘
k 个元素一组逆转链表,达到了预期的功能。
ChatGLM: