链表不同于顺序表,顾名思义,链表是有一个一个节点连接,逻辑结构类似于一条链子,所以称为链表。
而这种逻辑结构,也使得链表的插入和删除操作较为容易。
对于链表来说,删除只需将需要删除的节点的后继节点地址赋值给其前驱结点的指针域即可,例如将q节点后的节点删除的代码可大致写为:
int a=q.next->data;//保留q节点后继节点的数据
q.next=q.next->next;
而插入操作只需将需要给插入的元素新建一个节点,并将节点插入我们需要的位置即可,例如将元素插入链表q节点后的代码可大致写为:
linklist p;
p.data=a;
p.next=q.next;
q.next=p;
这种方法被称为尾插法,同理还有一种插入方法为头插法,设 l 为其头节点,则代码可大致如下:
l1 = l.next;
l.next = NULL;
l2 = l1->next;
l1->next = la.next;
la.next = l1;
l1 = l2;
而文章标题的两种题目,即分别用到了头插法和尾插法。
对于已知链表的倒序,如不进行新节点的创建,我们就需要用到头插法,利用循环将链表中的节点一个一个插入到链表的头节点之后:(图中la为头节点)
对于一组数分配到两个链表中,奇数位置上的数字分配到一个链表,偶数位置上的分配到另一个链表,且可以新建节点时,则可以使用较为简单的尾插法: