设计一个算法,在带头结点的单链表L的第i个位置插入元素x,成功操作返回true,否则返回false。(须定义单链表结点类型)
时间: 2024-09-25 16:02:11 浏览: 48
单链表相关的基本操作(从文件中读入)
设计一个算法来在带头结点的单链表L的第i个位置插入元素x,可以按照以下步骤来进行:
1. **初始化变量**:
- `current` 初始化为头节点,表示当前遍历的位置;
- `index` 设置为0,用于记录遍历过的节点数;
- `insertionSuccessful` 设置为 `false`,表示插入是否成功。
2. **遍历链表**:
- 当 `index < i` 时,将 `current` 指针向后移动一位,并将 `index++`。如果 `current == null` 或者 `index == i`,说明已到达目标位置,此时 `insertionSuccessful` 设置为 `true`。
3. **创建新节点**:
- 创建一个新的节点 `newNode`,并将其值设为 `x`。
4. **插入新节点**:
- 如果 `current.next` 不为 `null`,则将 `newNode.next` 设置为 `current.next`,把 `current.next` 指向 `newNode`。这实现了在第i个位置之后插入节点。
- 否则,说明已经到达链表尾部,直接将 `newNode.next` 设置为 `null` 并将 `current.next` 设置为 `newNode`,然后 `insertionSuccessful` 设置为 `true`,因为链表只有一个节点,插入就相当于追加。
5. **返回结果**:
- 执行完上述操作后,返回 `insertionSuccessful` 的值,即判断插入是否成功。
```c++
// 定义链表节点结构
typedef struct ListNode {
int val;
ListNode *next;
} ListNode;
bool insertAtPosition(ListNode* L, int x, int i) {
if (L == nullptr || i <= 0) return false; // 处理边界条件
ListNode *current = L;
int index = 0;
bool insertionSuccessful = false;
while (index < i) {
current = current->next;
index++;
if (!current) break;
}
if (index == i) {
// 插入到目标位置
ListNode *newNode = new ListNode{x};
newNode->next = current;
current->prev->next = newNode;
if (current->prev) current->prev = newNode;
else L = newNode; // 头结点的情况
insertionSuccessful = true;
}
return insertionSuccessful;
}
```
阅读全文