**# 数据结构算法习题总结:**
单链表:
1.删除链表中结点(保证数据不是末尾结点)
此题很巧妙,把他的后继结点的数值赋给要删除的节点,然后删除后继结点
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;
}
};
2.将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode newHead(0);
ListNode *pi = &newHead;
while(l1 && l2) {
if(l1->val > l2->val) swap(l1, l2);
pi->next = l1;
l1 = l1->next;
pi = pi->next;
}
pi->next = l1 ? l1 : l2;
return newHead.next;
}
};
3.存在一个按升序排列的链表,给你这个链表的头节点 head ,删除所有重复的元素,使每个元素只出现一次 。并返回同样按升序排列的结果链表。
public class Solution {
public ListNode DeleteDuplicates(ListNode head) {
if (head==null)
return head;
ListNode p=head;
while(p.next!=null)
if(p.val==p.next.val)
{
p.next=p.next.next;
}
else
{
p=p.next;
}
return head;
}
}
4.输出单链表中倒数第k个结点(从1开始数)
运用快慢指针的思想,快慢指针相隔k个,所以当快指针到表尾时,慢指针刚好到倒数第k个位置。
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode *fast=head;
ListNode *slow=head;
while(fast!=nullptr&&k>0)
{
fast=fast->next;
k--;
}
while(fast!=nullptr)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
};
5.反转链表,并返回反转后的链表的头节点
定义俩个结点pre,cur。
用temp暂存cur的后继,防止数据丢失。
cur的后继指向pre。
pre向后移到cur的位置。
cur移向他的后继。
以此循环,实现链表的逆置。
ListNode reverse(LiseNode head)
{
if(head==null)
return head;
if(head.next==null)
return head;
ListNode pre =null;
ListNode cur= head;
{
while cur!=null)
{
ListNode *temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
return pre;
}
}
6.从尾到头打印单链表,用数组返回。
public class Solution {
public int[] ReversePrint(ListNode head) {
int len =0;
ListNode node =head;
while(node!=null){
len++;
node=node.next;
}
int[] arr= new int[len];
node=head;
for(int i=len-1;i>=0;i--)
{arr[i]=node.val;
node=node.next;
}
return arr;
}
}