每日面试题
单向链表
单向链表中,只允许一次循环的前提下,如何得到倒数第k个节点的地址空间?
思路:
双指针,让一个指针先向前走k步,之后两个指针同步向前走,直到第一个指针走到NULL为止,此时第二个指针指向的节点几位倒数第k个节点。
ListNode *FindKthToTail(ListNode *head,int k){
ListNode *p = head;
ListNode *q = head;
while(k--){
q=q->next;
}
while(q != NULL){
q=q->next;
p=p->next;
}
return p;
}
双向链表
双向链表的节点结构
会有一个指向前的指针和一个指向后的指针,例如:
typedef struct line{
struct line *prior;
int data;
struct line *next;
};
双向链表的建立
同单向链表相比,双向链表仅是多了一个指向前的指针,每创建一个节点,都要与前驱节点建立两次联系:
第一次:新节点的prior指向前驱节点。
第二次:前驱节点的next指向新节点。
建立双向链表的代码如下:
line *initLine(Line *head){
head = (line *)malloc(sizeof(line));
head -> prior = NULL;
head -> data = 1;
head -> next = NULL;
line *list = head;
for(int i=0;i<3;i++){
line *body = (line *)malloc(sizeof(line));
body -> prior = NULL;
body -> next = NULL;
body -> data = 1;
list -> next = body;
body -> prior = list;
list = list -> next;
}
return head;
}