This is using the typical way to solve circular array problems; i.e., go through the array twice. In the case of Python it is a list and not an array. There may be some incorrect entries the first round through, but these get corrected on the second pass.

Also, rather than create a copy of the list with the list repeated, an pointer (index) is used that gets modded (%) by the length to find the correct place in the original list.

```
class Solution(object):
def nextGreaterElements(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
# Create a stack and a list to hold the result
stack = []; res = list(nums)
# Go thourh the list twice, starting from the right
for i in xrange(2*len(nums)-1, -1, -1):
# If there is not a solution at the end of the stack; pop
while stack and stack[-1] <= nums[i%len(nums)]: stack.pop()
# If the stack was empty put -1
if len(stack) == 0: res[i%len(nums)] = -1
# If there was a soluton at the end of the stack use that
else: res[i%len(nums)] = stack[-1]
# append the current value to the stack
stack.append(nums[i%len(nums)])
return res
```