对于一个链表 L: L0→L1→…→Ln-1→Ln,
将其翻转成 L0→Ln→L1→Ln-1→L2→Ln-2→…
输入是一串数字,请将其转换成单链表格式之后,再进行操作
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def link(self,seq):
if not seq:return None
head=ListNode(0)
cur=head
for i in seq:
cur.next=ListNode(i)
cur=cur.next
return head.next
def reorderList(self, head) :
#对特殊用例进行判断
if not head :return None
#对链表进行二分段
fast=slow=head
while fast and fast.next:
slow=slow.next
fast=fast.next.next
middle=slow.next
slow.next=None
#对第二段进行反转
pre,cur=None,middle
while cur:
cur.next,pre,cur=pre,cur,cur.next
#将两段合并
cur=head
while pre:
cur.next,pre.next,pre,cur=pre,cur.next,pre.next,cur.next
return head
if __name__=='__main__':
seq=list(map(int,input().split(',')))
s=Solution()
head=s.link(seq)
cur=s.reorderList(head)
ans=[]
while cur:
ans.append(cur.val)
cur=cur.next
print(*ans,sep=',')
#整体思路是:
#先根据输入初始化成一个单链表
#然后复制一个刚生成的链表
#把其中一个链表进行反转
#按照链表长度的一半次数合并两个链表,即可生成题目要求的链表
class Node(object):
def __init__(self,val):
self.val = val
self.next = None
class ClainList(object):
#初始化列表
def __init__(self,list):
self.count = 0
if not list:
return None
self.head = None
cur = None
for i in list:
if cur == None:
self.head = Node(i)
cur = self.head
else:
temp = Node(i)
cur.next = temp
cur = temp
self.count += 1
def reverse(self,head):
#反转链表
if not head:
return None
pre = head
if head.next == None:
return head
cur = head.next
head.next = None
if cur.next == None:
cur.next = pre
return cur
post = cur.next
while cur!=None:
cur.next = pre
if post == None:
break
pre = cur
cur = post
post=post.next
return cur
def series(self,head):
#把链表以字符串形式输出
res = []
cur = head
while cur:
res.append(cur.val)
cur = cur.next
print(','.join(map(str,res)))
def copy(self,head):
#复制一个新的链表
if not head:
return None
new_head = Node(head.val)
cur1 = head
cur2 = new_head
while cur1:
cur1 = cur1.next
if cur1:
temp = Node(cur1.val)
else:
temp = None
cur2.next = temp
cur2 = temp
return new_head
def combine(self,head1,head2,n):
#把两个顺序相反的链表合并成题目要求
if not head1 and not head2:
return None
cur1 = head1
cur2 = head2
post1 = head1.next
post2 = head2.next
new_cur = None
new_head = None
c = n//2
for i in range(c):
if new_head == None:
new_head = cur1
new_cur = cur1
else:
new_cur.next = cur1
new_cur = new_cur.next
new_cur.next = cur2
new_cur = new_cur.next
cur1 = post1
cur2 = post2
if not post1&nbs***bsp;not post2:
break
post1 = post1.next
post2 = post2.next
if n == 1:
new_head = new_cur = head1
elif n%2 == 1:
new_cur.next = cur1
new_cur = cur1
new_cur.next = None
return new_head
def main():
array = map(int,input().split(','))
s = ClainList(array)
n = s.count
head1 = s.copy(s.head)
head2 = s.reverse(s.head)
res = s.combine(head1,head2,n)
s.series(res)
main() | 48 ms | 10408K | Python 3 |
s = input().split(',')
t = len(s)
r = t//2
o = []
def f(a):
x,y = s[:r],s[r+a:][::-1] # 拆分翻转
for i in range(r):
o.extend([x[i],y[i]])
if a: o.append(s[r])
if t%2 == 1: f(1)
else: f(0)
print(','.join(o)) | 65 ms | 9740K | Python 3 |
s = input().split(',')
t = len(s)
d = t // 2
o = []
for i in range(d):
o.extend([s[i],s[-i-1]])
if 2*d != t:
o.append(s[d])
print(','.join(o)) | 769 ms | 9412K | Python 3 |
a = input().split(',')
# 反复横跳
c = [a.pop(-1) if i%2==1 else a.pop(0) for i in range(len(a))]
print(','.join(c))