前置条件
在链表中实现以下这些功能
get(index):返回下标为index的节点的val,如果index无效则返回-1
addAtHead(val):在链表头插入值为val的节点
addAtTail(val): 在链表尾插入值为val的节点
addAtIndex(index,val):在index位置前插入值为val的节点,如果index无效则不插入
deleteAtIndex(index):在index位置删除节点,如果index无效则不删除
- 单链表
class ListNode():
def __init__(self,val=0,next=None):
self.val = val
self.next = next
class MyLinkedList:
def __init__(self):
self.dummy =ListNode()
self.size = 0
def get(self, index: int) -> int:
if index<0 or index>=self.size:return -1
current = self.dummy
for i in range(index):
current = current.next
return current.next.val
def addAtHead(self, val: int) -> None:
new = ListNode(val=val)
new.next = self.dummy.next
self.dummy.next = new
self.size += 1
def addAtTail(self, val: int) -> None:
new = ListNode(val=val)
current = self.dummy
while current.next:
current = current.next
current.next = new
self.size += 1
def addAtIndex(self, index: int, val: int) -> None:
new = ListNode(val=val)
current = self.dummy
if index > self.size or index < 0:return -1
elif index == self.size:
for i in range(index):
current = current.next
current.next = new
else:
for i in range(index):
current = current.next
new.next = current.next
current.next = new
self.size += 1
def deleteAtIndex(self, index: int) -> None:
if index<0 or index>=self.size:return -1
current = self.dummy
for i in range(index):
current = current.next
current.next = current.next.next
self.size -= 1
- 双链表
class ListNode():
def __init__(self,val=0,pre=None,next=None):
self.val = val
self.pre = pre
self.next = next
class MyLinkedList:
def __init__(self):
self.dummy =ListNode()
self.size = 0
self.head = None
self.tail = None
def get(self, index: int) -> int:
if index < 0 or index >= self.size:return -1
if index < self.size // 2:
current = self.head
for i in range(index):
current = current.next
else:
current = self.tail
for i in range(self.size-index-1):
current = current.pre
return current.val
def addAtHead(self, val: int) -> None:
new = ListNode(val)
if self.head:
new.next = self.head
self.head.pre = new
else:
self.tail = new
self.head = new
self.size += 1
def addAtTail(self, val: int) -> None:
new = ListNode(val)
if self.tail:
self.tail.next = new
new.pre = self.tail
else:
self.head = new
self.tail = new
self.size += 1
def addAtIndex(self, index: int, val: int) -> None:
if index < 0 or index > self.size:return
if index==0 :
self.addAtHead(val)
elif index==self.size:
self.addAtTail(val)
else:
if index < self.size // 2:
current = self.head
for i in range(index):
current = current.next
else:
current = self.tail
for i in range(self.size - index -1):
current = current.pre
new = ListNode(val)
new.next = current
new.pre = current.pre
current.pre.next = new
current.pre = new
self.size += 1
def deleteAtIndex(self, index: int) -> None:
if index <0 or index>=self.size:return
if index == 0:
self.head = self.head.next
if self.head:
self.head.pre = None
else:
self.tail = None
elif index == self.size - 1:
self.tail = self.tail.pre
if self.tail:
self.tail.next = None
else:
self.head = None
else:
if index < self.size // 2:
current = self.head
for i in range(index):
current = current.next
else:
current = self.tail
for i in range(self.size - index - 1):
current = current.pre
current.pre.next = current.next
current.next.pre = current.pre
self.size -= 1