1.理解C 语言里是如何构造出链表的
1、首先创建头指针和头节点;
2、然后将temp指针指向头节点;
3、接着每创建一个新结点都要把前驱节点的指针指向这个新结点,
并且将temp指针指向这个新节点
参考代码如下:
struct ListNode* initLink() {
int i;
//1、创建头指针
struct ListNode* p = NULL;
//2、创建头结点
struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
temp->val = 0;
temp->next = NULL;
//头指针指向头结点
p = temp;
//3、每创建一个结点,都令其直接前驱结点的指针指向它
for (i = 1; i < 5; i++) {
//创建一个结点
struct ListNode* a = (struct ListNode*)malloc(sizeof(struct ListNode));
a->val = i;
a->next = NULL;
//每次 temp 指向的结点就是 a 的直接前驱结点
temp->next = a;
//temp指向下一个结点(也就是a),为下次添加结点做准备
temp = temp->next;
}
return p;
}
2.链表增加元素,首部、中间和尾部分别会有什么问题,该如何处理?
(1)在首部增加元素后会很容易忘记head指向新的头节点,将head = newNode即可解决问题;
(2)在中间增加元素要注意的问题是 我们必须要遍历到目标节点的前一个节点停下,
而不能直接遍历到目标节点以防止失去前驱节点的位置;
在给插入的新节点连线时不能先把目标节点的前个节点的指针指向新节点
(也就是newNode = cur.next),
要先等目标节点的前个节点的指针的指针先连到目标节点才行
(也就是cur.next = cur.next.next)
(3)在尾部增加元素直接将旧尾部节点指向新尾部节点就行了
3.链表删除元素,首部、中间和尾部分别会有什么问题,该如何处理?
(1)删除首部节点直接将head指向旧头部节点改为指向新头部节点即可
(2)删除中间节点直接将要删除节点的上一个节点的指针指向删除节点的下一个节点即可
(也就是cur.next = cur.next.next)
(3)删除尾部节点直接将旧尾部节点的上一个节点的指针指向null即可