已知 head 是指向一个带头结点的单链表的头指针,p 指向该链表的任一 结点。试写一算法,将 p 所指向的结点与其后继结点位置交换。
node *q = head;
node *k = p->next;
while (q->next != p) q = q->next;
q->next = k;
node *kn=k->next;
k->next = p;
p->next = kn;
【以下回答由 GPT 生成】
解决该问题的思路如下:
首先判断输入的参数是否有效,如果p为空或者p的next为空,则无法进行位置交换,直接返回头指针head。
我们需要找到p节点的前驱节点pre,可以从头结点开始遍历链表,直到找到p节点的前驱节点为止。
判断pre的next节点是否为空,如果为空则无法进行位置交换,直接返回头指针head。
判断p的next节点是否为空,如果为空则无法进行位置交换,直接返回头指针head。
将pre的next节点指向p的next节点,此时p节点已经被从链表中移除。
将p节点的next节点指向pre的next节点的next节点,即p节点的后继节点。
将pre的next节点的next节点指向p节点,即将p节点插入到pre的后面成为新的后继节点。
返回头指针head。
下面是使用Python语言实现上述算法的代码:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def swapNodes(head: ListNode, p: ListNode) -> ListNode:
# 判断p是否为空或者p的next是否为空
if p is None or p.next is None:
return head
# 找到p节点的前驱节点pre
pre = head
while pre.next != p:
pre = pre.next
# 判断pre的next是否为空
if pre.next is None:
return head
# 交换节点位置
pre.next = p.next
p.next = pre.next.next
pre.next.next = p
return head
希望以上解答对您有帮助!如果还有任何疑问,请随时追问。