1、在O(1)时间复杂度删除链表节点
将给定节点删除,让其值等于其下一个的值,此时此节点的指针指向其后两个节点的位置。
2、链表倒数第n个节点 删除链表倒数第n个节点
先用累加器计算出链表中元素的个数,然后从头结点开始找到倒数第n个节点(即第count-n+1个节点)。删除即再结合O(1)时间复杂度删除链表节点。
3、删除链表中的元素
从第一个元素开始比较其值是否等于给定的值,若相等则用head->next=head->next->next删除head->next,否则指针后移。
4、删除排序链表中的重复元素
前后两个相邻指针,若值相同,前一个指向其next的next,删除其next。注意空链表和只有头尾指针的情况。
5、翻转链表
将第一个元素移到最后一个元素,a=head->next,head指向last,last=a,head后移至NULL结束。
6、链表求和
思考有3种情况,第一:两个链表一样长;第二:两个链表非空但不一样长;第三:有空链表。第三种情况直接返回非空链表。当同一位置两个链表都有值时,加和,在新链表中的相应位置,若和<10,为原值,若值>10时,其除以10的余数为返回值,十位数加到下一位置两链表求和中。当同一位置有一链表结束,直接返回未结束链表。最后元素求和结束时若还有除以10的十位数需重新建立一个结点赋值。
7、链表插入排序
链表是从小到大排列的,若前一个比后一个大,后一个需要从前面找到合适的位置重新排序,用p、q代表前后相邻的节点,当p>q时用一个新节点从头找到最后一个比q小的,将p插到其后,否则p、q依次向后移动。
8、链表划分
创建两个链表,leftDummy和rightDummy分别代表小于和大于等于val的链表头结点,head依次后移,分别将小于和大于等于val的依次放入leftDummy和rightDummy,不需要排序,最后将两个链表合起来,leftDummy的最后一个节点指向rightDummy的第二个结点,rightDummy最后指向NULL。
9、合并两个链表
若有一个链表为空,直接输出非空链表,若两个链表都非空,找出最小的那个data 作为新的链表的第一个元素,然后两个链表从头开始比较大小,依次放到新的链表,取出元素后,其后元素依次前移,相当于两个链表都比较第一个元素。直到有一个链表结束,直接将另一个链表全部输出。
10、两两交换链表中的结点
若链表为空或只有一个元素直接返回,两两交换,先记下第一个结点的值,将后一个节点的值赋给前一个节点,后一个节点等于记下的前一个节点的值。然后节点后移两个。
感想:题目中给出的head是链表的第一个元素,后面定义节点x=head,用x对原链表进行修改,最后返回的head即修改后的链(返回头结点代表链)。倒数第几个的题目可以将head认为是空的头结点,其他不可以。