示例#1
0
    def isPalindrome(self, head: ListNode) -> bool:
        lenh = 0
        p = head

        # 链表长度
        while p:
            lenh += 1
            p = p.next

        # 后半部分
        mid = (lenh + 1) // 2
        left, rightp = head, head
        for _ in range(mid):
            rightp = rightp.next

        # 后半部分翻转
        dumpy = ListNode(0)
        while rightp:
            tmp = rightp.next
            rightp.next = dumpy.next
            dumpy.next = rightp
            rightp = tmp
        right = dumpy.next

        #回文判断
        while right:
            if left.val != right.val:
                return False
            left = left.next
            right = right.next
        return True
示例#2
0
 def reverseList(self, head: ListNode) -> ListNode:
     dumpy = ListNode(0)
     while head:
         tmp = head
         head = head.next
         tmp.next = dumpy.next
         dumpy.next = tmp
     return dumpy.next
示例#3
0
 def reverseList(self, head: ListNode) -> ListNode:
     res = ListNode(0)
     p = head
     while head:
         head = head.next
         p.next = res.next
         res.next = p
         p = head
     return res.next
示例#4
0
 def reverseList(self, head: ListNode) -> ListNode:
     dumpy = ListNode(0)
     first = head
     while head:
         head = head.next
         first.next = dumpy.next
         dumpy.next = first
         first = head
     return dumpy.next
 def deleteNode(self, head: ListNode, val: int) -> ListNode:
     dumpy = ListNode(0)
     dumpy.next = head
     p = dumpy
     while p.next:
         if p.next.val == val:
             p.next = p.next.next
             break
         p = p.next
     return dumpy.next
示例#6
0
 def merge(self, l1: ListNode, l2: ListNode):
     if not l1:
         return l2
     if not l2:
         return l1
     if l1.val < l2.val:
         l1.next = self.merge(l1.next, l2)
         return l1
     l2.next = self.merge(l1, l2.next)
     return l2
示例#7
0
 def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
     dumpy = ListNode(0)
     dumpy.next = head
     p = dumpy
     for _ in range(n):
         head = head.next
     while head:
         head = head.next
         p = p.next
     p.next = p.next.next
     return dumpy.next
示例#8
0
 def removeElements(self, head: ListNode, val: int) -> ListNode:
     # 哨兵结点
     dumpy = ListNode(0)
     dumpy.next = head
     prev, curr = dumpy, head
     while curr:
         if curr.val == val:
             prev.next = curr.next
         else:
             prev = curr
         curr = curr.next
     return dumpy.next
示例#9
0
def removeNthFromEnd(head,n):
	dummy = ListNode(0)
	dummy.next = head
	fast = dummy
	while n:
		fast = fast.next
		n -= 1
	listprint(fast)
	slow = dummy
	while fast.next:
		fast = fast.next
		slow = slow.next
	slow.next = slow.next.next
	return dummy.next
 def deleteDuplicates(self, head: ListNode) -> ListNode:
     if not head:
         return head
     dumpy = ListNode(0)
     dumpy.next = head
     p1, p2 = head, head
     while p2.next:
         if p2.next.val == p1.val:
             p2 = p2.next
             continue
         p2 = p2.next
         p1.next = p2
         p1 = p2
     p1.next = p2.next
     return dumpy.next
示例#11
0
 def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
     dumpy = ListNode(0)
     dumpy.next = l1
     p = dumpy
     while l1 and l2:
         if l1.val <= l2.val:
             l1 = l1.next
             p = p.next
         else:
             p.next = l2
             p = p.next
             l2 = l2.next
             p.next = l1
     if l2:
         p.next = l2
     return dumpy.next
示例#12
0
 def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
     dumpy = ListNode(0)
     add1, add2, ans, p = 0, 0, 0, dumpy
     while l1 or l2:
         if l1:
             add1 = l1.val
             l1 = l1.next
         if l2:
             add2 = l2.val
             l2 = l2.next
         ans, mod = divmod(add1 + add2 + ans, 10)
         add1 = add2 = 0
         p.next = ListNode(mod)
         p = p.next
     if ans > 0:
         p.next = ListNode(ans)
     return dumpy.next
示例#13
0
 def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
     dumpy = ListNode(0)
     dumpy.next = l1
     l = dumpy
     ans = 0
     while l1 or l2:
         a = l1.val if l1 else 0
         b = l2.val if l2 else 0
         ans += a + b
         ans, mod = divmod(ans, 10)
         l.next = ListNode(mod)
         l = l.next
         if l1:
             l1 = l1.next
         if l2:
             l2 = l2.next
     if ans > 0:
         l.next = ListNode(1)
     return dumpy.next
示例#14
0
 def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
     dumpy = ListNode(0, head)
     slow, fast = head, head
     for _ in range(n):
         fast = fast.next
     if not fast:
         return dumpy.next.next
     while fast.next:
         slow = slow.next
         fast = fast.next
     slow.next = slow.next.next
     return dumpy.next
示例#15
0
def swapPairs(head):
	if not head or not head.next:
		return head
	
	dummynode = ListNode(0)
	dummynode.next = head
	pre = dummynode
	first = head
	second = head.next
	while first and second:
		pre.next = second
		nex = second.next
		second.next = first
		first.next = nex

		pre = first
		if first.next:
			second = first.next.next
			first = first.next
		else:
			break
	return dummynode.next
 def deleteDuplicates(self, head: ListNode) -> ListNode:
     if not head:
         return head
     dumpy = ListNode(0)
     dumpy.next = head
     p1, p2, p3 = dumpy, head, head
     count = 0
     while p3.next:
         if p3.next.val == p2.val:
             p3 = p3.next
             count += 1
             continue
         p3 = p3.next
         p2 = p3
         if count > 0:
             p1.next = p3
         else:
             p1 = p1.next
         count = 0
     if count > 0:
         p1.next = p3.next
     return dumpy.next
示例#17
0
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        prehead = ListNode(-1)

        prev = prehead
        while l1 and l2:
            if l1.val <= l2.val:
                prev.next = l1
                l1 = l1.next
            else:
                prev.next = l2
                l2 = l2.next
            prev = prev.next
        prev.next = l1 if l1 is not None else l2
        return prehead.next
示例#18
0
    def rotateRight(self, head: ListNode, k: int) -> ListNode:
        if not head:
            return head
        p1 = head
        lenh = 0
        while p1.next:
            p1 = p1.next
            lenh += 1
        lenh += 1
        k %= lenh
        if k == 0:
            return head

        dumpy = ListNode(0)
        dumpy.next = head
        p2 = head
        for _ in range(lenh - k - 1):
            p2 = p2.next
        dumpy.next = p2.next
        p1.next = head
        p2.next = None

        return dumpy.next
输出:[4,5,9]
解释:给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
 

提示:

链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
"""
from LinkList import stringToListNode, ListNode


class Solution:
    def deleteNode(self, node):
        """
        :type node: ListNode
        :rtype: void Do not return anything, modify node in-place instead.
        """
        node.val = node.next.val
        node.next = node.next.next


if __name__ == '__main__':
    nums = "4,5,1,9"
    node = ListNode(5)
    head = stringToListNode(nums)
    sol = Solution()
    sol.deleteNode(node)
示例#20
0
def removeNthFromEnd(head,n):
	dummy = ListNode(0)
	dummy.next = head
	fast = dummy
	while n:
		fast = fast.next
		n -= 1
	listprint(fast)
	slow = dummy
	while fast.next:
		fast = fast.next
		slow = slow.next
	slow.next = slow.next.next
	return dummy.next

e1 = ListNode(1)
e2 = ListNode(2)
e3 = ListNode(3)
e4 = ListNode(4)
e5 = ListNode(5)
e6 = ListNode(6)
e7 = ListNode(7)
head = e1
e1.next = e2
e2.next = e3
e3.next = e4
e4.next = e5
e5.next = e6
e6.next = e7
listprint(head)
print('-----')
示例#21
0
from LinkList import LinkList, ListNode

list1 = LinkList()

list1.append(ListNode(1))
list1.append(ListNode(2))
list1.append(ListNode(3))
list1.append(ListNode(3))
list1.append(ListNode(4))
list1.append(ListNode(4))
list1.append(ListNode(5))
list1.append(ListNode(6))
list1.append(ListNode(7))
list1.append(ListNode(7))
list1.append(ListNode(8))
list1.append(ListNode(9))
list1.append(ListNode(9))
list1.append(ListNode(9))


def removeDuplicate(head):
    lastVal = None
    current = head.next
    while current:
        nextNode = current.next
        if current.val == lastVal:
            current.next = nextNode.next
        else:
            lastVal = current.val
        current = nextNode
    return head