单链表的翻转,见代码:
void reverse(pNode *pList)
{
pNode pre,curr,nxt;
pre = curr = nxt = NULL;
for (curr = *pList; curr;nxt = curr->next,curr->next = pre,pre = curr,curr = nxt);
*pList = pre;
}
需要三个指针,分别记录当前结点,已经完成翻转的链表的头结点,当前结点的后继结点位置。
单链表的倒数第K个结点(K从1开始):
思路:2个指针p, q初始化指向头结点.p先跑到k结点处, 然后q再开始跑, 当p跑到最后跑到尾巴时, q正好到达倒数第k个.复杂度O(n).
代码:
pNode reversedKth(pNode pHead,int K)
{
int i = 0;
pNode p,q;
for(p=pHead;p && i<K;p=p->next,i++);
if(i<K)
return NULL;
for(q=pHead;p;p=p->next,q=q->next);
return q;
}
单链表的中间结点:
思路:算法:设两个初始化指向头结点的指针p, q.p每次前进两个结点, q每次前进一个结点, 这样当p到达链表尾巴的时候, q到达了中间.复杂度O(n).
代码:
pNode middle(pNode pHead)
{
pNode p,q;
for(p=q=pHead;p->next;p=p->next->next,q=q->next)
{
if(!p->next->next) break;
};
return q;
}
两个长短不一的链表右对齐打印:
思路:参考两个单链表的交叉结点求解。
代码:
void parallelShow(pNode a,pNode b)
{
/* refer to intersection calculation of two intersected link list. */
pNode p,q,t,k,s;
for(p=a,q=b;p && q;p=p->next,q=q->next);
k = p?p:q;
t = p?a:b;
s = p?b:a;
for(;t;t=t->next){
printf("%c",t->ch);
if(t->next) printf("->");
}
printf("\n");
for(;k;k=k->next){
printf(" ");
}
for(;s;s=s->next){
printf("%c",s->ch);
if(s->next) printf("->");
}
printf("\n");
}
测试代码:
#include <stdio.h>
typedef struct Node{
char ch;
Node * next;
}Node,*pNode;
void DisplayList(pNode pHead)
{
while(pHead){
printf("%-3c",pHead->ch);
pHead = pHead->next;
}
printf("\n");
}
void reverse(pNode *pList)
{
pNode pre,curr,nxt;
pre = curr = nxt = NULL;
for (curr = *pList; curr;nxt = curr->next,curr->next = pre,pre = curr,curr = nxt);
*pList = pre;
}
pNode reversedKth(pNode pHead,int K)
{
int i = 0;
pNode p,q;
for(p=pHead;p && i<K;p=p->next,i++);
if(i<K)
return NULL;
for(q=pHead;p;p=p->next,q=q->next);
return q;
}
pNode middle(pNode pHead)
{
pNode p,q;
for(p=q=pHead;p->next;p=p->next->next,q=q->next)
{
if(!p->next->next) break;
};
return q;
}
void parallelShow(pNode a,pNode b)
{
/* refer to intersection calculation of two intersected link list. */
pNode p,q,t,k,s;
for(p=a,q=b;p && q;p=p->next,q=q->next);
k = p?p:q;
t = p?a:b;
s = p?b:a;
for(;t;t=t->next){
printf("%c",t->ch);
if(t->next) printf("->");
}
printf("\n");
for(;k;k=k->next){
printf(" ");
}
for(;s;s=s->next){
printf("%c",s->ch);
if(s->next) printf("->");
}
printf("\n");
}
void main(){
Node e = {'e',NULL},d = {'d',&e}, c = {'c',&d}, b = {'b',&c}, a = {'a',&b};
Node l2 = {'l'+1,NULL},l1 = {'l',&l2};
Node x1 = {'x',NULL};
pNode pa;
parallelShow(&a,&l1);
int k[] = {1,2,3,4,5};
pa = &a;
printf("List a:\n");DisplayList(pa);
for (int i=0;i<5;i++)
{
pNode pT = reversedKth(pa,k[i]);
printf("Reversed %dth node is: %c\n",k[i],pT->ch);
}
printf("The middle node of List %c is: %c\n",a.ch,middle(&a)->ch);
printf("The middle node of List %c is: %c\n",b.ch,middle(&b)->ch);
printf("The middle node of List %c is: %c\n",e.ch,middle(&e)->ch);
DisplayList(&a);
pa = &a;
reverse(&pa);
DisplayList(pa);
DisplayList(&l1);
pa = &l1;
reverse(&pa);
DisplayList(pa);
DisplayList(&x1);
pa = &x1;
reverse(&pa);
DisplayList(pa);
}
测试输出:
a->b->c->d->e
l->m
List a:
a b c d e
Reversed 1th node is: e
Reversed 2th node is: d
Reversed 3th node is: c
Reversed 4th node is: b
Reversed 5th node is: a
The middle node of List a is: c
The middle node of List b is: c
The middle node of List e is: e
a b c d e
e d c b a
l m
m l
x
x
REF:
1,http://hit9.org/oldblog/blog/C/posts/25.html#4