rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cddnw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">
说明:这里的链表均为带头结点的单链表
1、链表的有序合并:链表的数据结构如下
struct List
{
int data;
struct List *next;
};
已知现在有两个链表头La, Lb,且这两个链表的节点按data递增次序排列,要将这两个链表合并成一个链表Lc(可以破坏链表La,Lb的结构)
- pc = Lc = La;
- pa = La->next;
- pb = Lb->next;
- while(NULL != pa && NULL != pb)
- {
- if( pa->data > pb->data)
- {
- pc->next = pb; pc = pb; pb++;
- }
- else
- {
- pc->next = pa; pc = pa; pa++;
- }
- }
- pc = pa ? pa : pb;
2、链表的就地逆置:不用额外的空间,将链表的指向反过来,比如原来的链表是:头->a->b->c 变成 头->c->b->a
方法一:
- curr = L->next;
- nextPtr = NULL;
- if( NULL != curr)
- nextPtr = curr->next;
- while( NULL != nextPtr )
- {
- temp = nextPtr->next;
- nextPtr->next = curr;
- curr = nextPtr;
- nextPtr = temp;
- }
- if( NULL != L->next)
- L->next->next = NULL;
- L->next = curr;
方法二:前插
- curr = L->next;
- L->next = NULL;
- while( NULL != curr )
- {
- nextPtr = curr->next;
- curr->next = L->next;
- L->next = curr;
- curr = nextPtr; }
3、判断两个单链表是否相交,如果相交,指出相交处(单链表相交的意思是指部分节点有重合)
方法:如果LA,LB相交,那么最后一个节点肯定重合,只要遍历LA,LB到最后一个节点,判断其地址是否一样即可。
判断相交处的方法:判是否相交时已经遍历了两个链表,则记下这两个链表的长度,假设分别是lenA, lenB;且
lenA > lenB ,那么进行第二次遍历,且令LA先走(lenA - lenB)步,然后两个链表一起遍历,中途遇到的相同地址的节点,肯定是链表的相交处。
4、判断单链表是否是有环。(有环的意思是某个节点的指针域指向该链表先前的节点)
方法:有两个遍历指针,一个指针一次走一步(慢指针),另一个指针一次走两步(快指针);如果快指针最后为空,则说明无环;如果快指针在遍历的过程中与慢指针相等,则说明有环。
- bool haveRing(struct List *L)
- {
- struct List *pfast, *pslow;
- pfast = pslow = L;
- do
- {
- pfast = pfast->next;
- if( NULL == pfast)
- break;
- else pfast = pfast->next;
- pslow = pslow->next;
- if( pslow == pfast)
- break;
- }while(NULL != pfast);
- return (NULL != pfast);
- }