四、写一段程序,让一个单链表的后一半元素反转。 如 1->2->3->5->6->7 处理后为 1->2->3->7->6->5 如 1->2->3->8->9 处理后为 1->2->3->9->8 链表数据结构同题三。描述你的算法。 描述:
时间: 2024-06-12 21:09:31 浏览: 125
算法-单链表遍历及反转(java)(csdn)————程序.pdf
算法描述:
首先,我们需要找到链表的中间节点。可以使用快慢指针的方法,一个指针每次移动两步,另一个指针每次移动一步,当快指针到达链表末尾时,慢指针正好在中间节点位置。
接下来,我们将中间节点之后的链表进行反转。可以使用三个指针的方法,依次遍历链表节点,并修改节点的指针方向,将当前节点的next指向前一个节点。
最后,我们将链表的前半部分和反转后的后半部分进行合并。可以使用两个指针分别指向两部分的头节点,依次连接两部分节点即可。
具体实现代码如下:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverseSecondHalf(head):
if not head or not head.next:
return head
# 寻找中间节点
slow = head
fast = head
while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
# 反转后半部分
pre = None
cur = slow.next
while cur:
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
slow.next = pre
return head
# 创建链表
head = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(5)
node5 = ListNode(6)
node6 = ListNode(7)
head.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node6
# 反转后半部分
head = reverseSecondHalf(head)
# 打印链表
while head:
print(head.val, end="->")
head = head.next
```
输出结果为:1->2->3->7->6->5->
阅读全文