删除链表倒数第n个元素
要实现一个链表并删除链表的倒数第n个元素,首先需要定义链表的节点结构,然后实现链表的基本操作,包括插入元素和删除元素。以下是使用Python语言实现链表并删除倒数第n个元素的示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
class ListNode:
def __init__(self, value=0, next=None):
self.value = value
self.next = next
class LinkedList:
def __init__(self):
self.head = None
def append(self, value):
new_node = ListNode(value)
if not self.head:
self.head = new_node
else:
current = self.node
while current.next:
current = current.next
current.next = new_node
def print_list(self):
current = self.head
while current:
print(current.value, end=" -> ")
current = current.next
print("None")
def delete_nth_from_end(self, n):
dummy = ListNode(0)
dummy.next = self.head
fast = dummy
slow = dummy
# 将fast指针向前移动n+1个位置
for _ in range(n+1):
if fast:
fast = fast.next
# 同时移动fast和slow指针,直到fast到达链表末尾
while fast:
fast = fast.next
slow = slow.next
# 删除倒数第n个节点
if slow.next:
slow.next = slow.next.next
# 更新链表头
self.head = dummy.next
# 示例用法
linked_list = LinkedList()
linked_list.append(1)
linked_list.append(2)
linked_list.append(3)
linked_list.append(4)
linked_list.append(5)
print("原始链表:")
linked_list.print_list()
n = 2
linked_list.delete_nth_from_end(n)
print(f"删除倒数第{n}个元素后的链表:")
linked_list.print_list()
|
在这个示例中,首先定义了一个ListNode类来表示链表节点,每个节点包含一个value属性用于存储节点的值,以及一个next属性用于指向下一个节点。然后,定义了一个LinkedList类来表示链表,它包含一些基本操作,如append用于在链表末尾添加元素,print_list用于打印链表中的元素,以及delete_nth_from_end用于删除链表的倒数第n个元素。
在delete_nth_from_end方法中,使用了快慢指针的技巧。首先,创建了一个虚拟节点dummy,并将其next指针指向链表的头节点。然后,我们将快指针fast向前移动n+1个位置,这样快指针和慢指针之间就保持了n个节点的距离。接下来,同时移动快指针和慢指针,直到快指针到达链表末尾。此时,慢指针指向的节点就是倒数第n+1个节点,可以通过修改慢指针的next指针来删除倒数第n个节点。最后,更新链表的头节点为虚拟节点的下一个节点。
在示例用法中,创建了一个链表并添加了5个元素。然后,调用delete_nth_from_end方法来删除链表的倒数第2个元素,并打印删除元素后的链表。
参考