链表的小题目

链表的小题目

1、倒转单链表

     非递归法

    

view plain
  1. struct Node  
  2. {  
  3.   int data;  
  4.   Node * next;  
  5. }  
  6. void reverse(Node*& head) {  
  7.   if (head == NULL) {  
  8.      return;  
  9.   }  
  10.   Node * pre, * cur, * nxt;  
  11.   pre = head;  
  12.   cur = head -> next;  
  13.   while (cur != NULL) {  
  14.      pre = cur -> next;  
  15.      pre = cur;  
  16.      cur = nxt;  
  17.      nxt = nxt -> next;  
  18.   }  
  19.   head -> next = NULL;  
  20.   head = pre;  
  21. }  
 

 

 

     递归法

    

view plain
  1. Node * reverse(Node * node, Node *&head)  
  2. {  
  3.      if (node == NULL || node -> next == NULL) {  
  4.          head = node;  
  5.          return;  
  6.      }  
  7.      else {  
  8.         Node * nxt = reverse(node -> next, head)  
  9.         node = nxt -> next;  
  10.         return node;  
  11.      }  
  12. }  
  13. 最后要将返回的node的next域设为NULL。  

 

 

2、找出倒数第k个元素(或中间元素):设置快慢指针

3、删除环状单链表的一个节点,只给定指向要删除节点的指针

     思路:无法获取前一个指针,那么可删除下一个节点,交换当前节点和下一个节点的值即可

4、两个有序链表的合并

     归并即可

 

5、判断单链表是否有环?环首?

     是否有环:快慢指针,如果相遇,说明存在环

     环首:可先求出环长。一个圆内的追及问题,两次相遇时慢指针走过的距离即环长;

              此时假设慢指针已走了i步,则快指针已走了2i步;两个指针同时倒退i步的位置,慢指针退到链首,快指针退到i处,则从这两个位置起,指针各走i步既能在环内相遇。

              于是可设置两个指针,一个在链首处,一个在i处,步长为1,第一次相遇的节点即为环首的位置。

 

6、如何判断两个链表是否交叉?如果找到交叉点?
     思路同5

你可能感兴趣的:(链表的小题目)