写出在不带头结点的单链表上的第i位置删除和插入一个结点的算法 请写出具体代码实践
时间: 2024-10-26 22:03:04 浏览: 17
在不带头结点的单链表上删除第i个节点通常需要分为两部分:判断链表长度是否足够插入或删除,以及执行实际操作。这里假设已经有一个指向当前节点的指针`current`。
**删除第i个节点:**
1. 首先检查链表是否为空,如果为空则直接返回。
2. 计算链表的实际长度,如果`i`小于等于0或者大于实际长度,则说明索引越界,可以返回错误信息。
3. 初始化两个指针`prev`和`curr`,`prev`初始化为`NULL`,`curr`指向头节点。
4. 使用循环遍历,找到第i个节点:
- 当`curr`不为空时,移动`prev`到`curr`,然后`curr`移到下一个节点。
- 当`curr`到达第i个节点时,记录下它并停止遍历。
5. 删除第i个节点,即释放`curr`所指向的数据,并将`prev`的`next`指向`curr->next`。
**Python 代码示例:**
```python
def delete_node_at_index(head, i):
if not head or i <= 0:
return None
prev = None
curr = head
count = 0
while curr and count < i - 1:
prev = curr
curr = curr.next
count += 1
if curr is None:
# 索引越界
return head
prev.next = curr.next
return head
```
**插入第i个节点:**
1. 判断链表是否为空,如果为空则直接创建新节点并返回。
2. 创建一个新节点`new_node`,并将数据存储在其`data`字段。
3. 初始化`prev`、`curr`和`next`指针,`prev`为`NULL`,`curr`为头节点,`next`为`NULL`(用于临时保存插入位置的前一个节点)。
4. 和删除一样,通过循环找到第i个位置:
- 如果`curr`等于`NULL`,说明找到了目标位置,此时`prev`就是插入的位置。
- 否则,`curr`移至下一个节点,计数加1。
5. 插入节点:`prev.next = new_node`
6. `new_node.next = curr`,连接新节点与插入后的节点。
**Python 代码示例:**
```python
def insert_node_at_index(head, i, data):
if not head:
return Node(data)
new_node = Node(data)
prev = None
curr = head
for _ in range(i):
if not curr:
break
prev = curr
curr = curr.next
if not curr:
# 越界,插入到末尾
prev.next = new_node
return head
new_node.next = curr
prev.next = new_node
return head
```
**相关问题--:**
1. 删除操作的时间复杂度是多少?
2. 如果要在链表头部插入节点,应该如何修改上述代码?
3. 插入操作如何处理链表长度不足的情况?
阅读全文