对于链表,每个节点通常包含至少两个部分:数据部分和指针部分。数据部分存储节点的值,而指针部分存储指向链表中下一个节点的指针。
以下是一些链表的基本操作及其意义:
-
创建节点:
ListNode* newNode = new ListNode(value);
创建一个新的节点对象,并将数据部分初始化为
value
。 -
设置节点的值:
newNode->val = value;
将节点的数据部分设置为
value
。 -
设置节点的指针:
newNode->next = someOtherNode;
将节点的指针部分设置为指向另一个节点
someOtherNode
。 -
获取节点的值:
int value = someNode->val;
通过节点的指针访问其数据部分,获取节点的值。
-
获取节点的下一个节点:
ListNode* nextNode = someNode->next;
通过节点的指针访问其指针部分,获取指向链表中下一个节点的指针。
-
插入节点:
- 头插法:在链表的头部插入一个新节点。
ListNode* newNode = new ListNode(value); newNode->next = head; // 新节点指向原头节点 head = newNode; // 更新头指针指向新节点
- 尾插法:在链表的尾部插入一个新节点。
ListNode* newNode = new ListNode(value); if (head == NULL) { head = newNode; // 如果链表为空,新节点成为头节点 } else { ListNode* current = head; while (current->next != NULL) { current = current->next; } current->next = newNode; // 将最后一个节点的指针指向新节点 newNode->next = NULL; // 新节点的指针设置为NULL }
-
删除节点:
ListNode* current = head; while (current != NULL && current->next != NULL) { if (current->next->val == value) { ListNode* temp = current->next; current->next = temp->next; // 跳过要删除的节点 delete temp; // 释放节点内存 } else { current = current->next; } }
遍历链表,找到要删除的节点,并将其从链表中移除。
-
遍历链表:
ListNode* current = head; while (current != NULL) { // 处理当前节点 current = current->next; // 移动到下一个节点 }
从头节点开始,通过节点的指针逐个访问链表中的每个节点。
-
查找节点:
ListNode* current = head; while (current != NULL) { if (current->val == value) { // 找到节点 break; } current = current->next; }
从头节点开始,遍历链表直到找到值为
value
的节点。 -
反转链表:
ListNode* prev = NULL; ListNode* current = head; ListNode* next = NULL; while (current != NULL) { next = current->next; // 保存下一个节点 current->next = prev; // 反转指针 prev = current; // 移动prev和current current = next; } head = prev; // 更新头指针
反转链表中的节点的指针方向。
注意:
使用 cur->next!=NULL时 必须cur不为空,如果为空,那么没有意义
链表
链表基础
leetcode
删除 https://leetcode.cn/problems/remove-linked-list-elements/description/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* xuni = new ListNode(0);
xuni->next = head;
ListNode* cur =xuni;
while(cur->next !=NULL){
if(cur->next->val==val){
ListNode* pre = cur->next;
cur->next=pre->next;
delete pre;
}else{
cur=cur->next;
}
}
head = xuni->next;
delete xuni;
return head;
}
};
例1a:链表逆序(206) https://www.programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
例1b:链表逆序2(92)
例2:链表求交点(160)
例3:链表求环(141)
例4:链表划分(86)
例5:复杂链表的复制(138)
例6:2个排序链表归并(21)
例7:K个排序链表归并(23)
剑指offer
例1:从尾到头打印链表(3)
例2:链表中倒数第k个节点(14)
例3:反转链表(15)
例4: 合并两个排序链表(16)
例5: 复杂链表的复制(25)
例6: 两个链表的第一个公共节点(35)
例7: 孩子们的游戏(圆圈中最后剩下的数)(45)
例8:链表中环入口节点(54)
例9:删除链表中重复节点(55)