数据结构-OJ面试题-基础三道链表题-3-
删除链表中重复的节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
1.保存当前节点的上一个节点
2.看下一个节点next的值是否和当前节点cur相同,若相同,则next继续向后遍历,找第一个和当前节点不通过的家电next
3.删除当前节点cur与next指点的所有节点
4.重新连接prev->next
如果cur与next的值不同,cur向后移动一步,prev指向cur,next向后移动一步
ListNode* deleteDuplication(ListNode* pHead)
{
struct ListNode* prev = NULL;
struct ListNode* cur = pHead;
struct ListNode* next = cur->next;
if(pHead == NULL || pHead->next == NULL)
return pHead;
while(next)
{
//判断当前节点的值是否和下一个节点的值相同
if(cur->val == next->val)
{
//向后找第一个值不相等的节点
next = next->next;
while(next)
{
if(next->val != cur->val)
break;
next = next->next;
}
//删除cur到next之间的所有节点
while(cur != next)
{
struct ListNode* temp = cur;
cur = cur->next;
free(temp);
}
if(prev == NULL)
//如果删除头节点,更新头节点
pHead = cur;
else
prev->next = next;
if(next)
next = next->next;
}
else
{
prev = cur;
cur = next;
next = next->next;
}
}
return pHead;
}
链表的回文结构
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
思路
1.找到链表的中间节点
2.逆转链表后半部分
3.比较链表其后两部分对应位置的值,如果全部相等,则链表为一个回文结构
bool chkPalindrome(ListNode* A) {
// write code here
if(A==NULL)
return false;
else if(A->next==NULL)
return true;
//快慢指针找出中间节点
ListNode* quick=A;
ListNode* slow=A;
while(quick!=NULL&&quick->next!=NULL)
{
quick=quick->next->next;
slow=slow->next;
}
//反转
ListNode* p=slow->next;
ListNode* p1=p->next;
while(p!=NULL)
{
p->next=slow;
slow=p;
p=p1;
p1=p1->next;
}
while(A!=slow)
{
if((A->val)!=(slow->val);
return false;
else
{
if(A->next==slow)
return true;
A=A->next;
slow=slow->next;
}
}
return true;
}
160.相交链表
编写一个程序,找到两个单链表相交的起始节点
stNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int lenA = 0;
int lenB = 0;
ListNode *curA = headA;
ListNode *curB = headB;
while(curA && curA != NULL)
{
lenA++;
curA = curA->next;
}
while(curB && curB != NULL)
{
lenB++;
curB = curB->next;
}
//1.不相交
//2.相交
if(curA !=curB)
return NULL;
else
{
int gap = abs(lenA - lenB);
ListNode *longList = headA, *shortList = headB;
if(lenA < lenB)
{
longList = headB;
shortList = headA;
}
while(gap--)
longList = longList->next;
while(1)
{
if(longList == shortList)
return longList;
else
{
longList = longList->next;
shortList = shortList->next;
}
}
}
}