24 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
![](https://img-blog.csdnimg.cn/img_convert/b7ca2fb59e85914db7d911c371579f86.jpeg)
思考:主要是看了题解才搞清楚怎么做的,先设置一个dummyNode指向head,原始顺序为dummyNode->node1->node2,要变换成dummyNode->node2->node1,
cur := dummyNode
cur.Next = node2
node1.Next = node2.Next
node2.Next = node1
然后cur节点向后走两步。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func swapPairs(head *ListNode) *ListNode {
dummy := &ListNode{Next:head}
cur := dummy
for cur.Next != nil && cur.Next.Next != nil{
node1 := cur.Next
node2 := cur.Next.Next
cur.Next = node2
node1.Next = node2.Next
node2.Next = node1
cur = cur.Next.Next
}
return dummy.Next
}
19 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
![](https://img-blog.csdnimg.cn/img_convert/121b1dbdfd079c32452752437357907a.jpeg)
思考:之前做过这题,使用快慢指针,快指针先走n+1步,然后快慢指针一起向后走,当快指针指向nil的时候,删除慢指针后面的那个节点即可。
func removeNthFromEnd(head *ListNode, n int) *ListNode {
dummyNode := &ListNode{Next:head}
slow := dummyNode
fast := dummyNode
// for i :=0; i<n+1; i++{
// fast = fast.Next
// }
i := 0
for fast != nil {
fast = fast.Next
if i > n {
slow = slow.Next
}
i++
}
slow.Next = slow.Next.Next
return dummyNode.Next
}
面试题 02.07. 链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
思考:直接参考的答案,两个链表对齐后端,即长的链表先走到剩下长度和短的链表长度一致的地方,然后一一进行比对。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func getIntersectionNode(headA, headB *ListNode) *ListNode {
cur1, cur2 := headA, headB
len1, len2 := 0, 0
for cur1 != nil{
cur1 = cur1.Next
len1++
}
for cur2 != nil {
cur2 = cur2.Next
len2++
}
var step int
var p1, p2 *ListNode
if len2 > len1{
step = len2 - len1
p1, p2 = headB, headA
}else{
step = len1 - len2
p1, p2 = headA, headB
}
for i:=0; i< step; i++{
p1 = p1.Next
}
for p2 != nil{
if p1 == p2 {
return p1
}
p1 = p1.Next
p2 = p2.Next
}
return nil
}